Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
1

Динамически менять размеры Сетки (Grid)

08.12.2012, 23:58. Показов 2926. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть проблема:
нужно вывести матрицу, но её размеры могут меняться поэтому нужно динам. выстраивать GridLayout, да только беда в том что GridLayout не умеет динамически менять размеры (ну чтобы руками написать чтобы он стал X x Y, а не сколько влезет на сколько влезет).

Проблема в виде кода:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
public class MainClass  extends JFrame
{
    public MainClass() throws WrongArgumentException
    {
        super("Шаблонная матрица");
        
        //моя матрица которую я собрался выводить в сетку. Есть метод изм. размера
        final GenericMatrix<Integer> gen = new GenericMatrix<>(3,3,0);
        
        //панельл с сеткой куда буду выводить матрицу. В зависимости от размеров матрици 
        //эта панель должна динам. менять размеры x  и y, не просто вписав всё как попало
        //а чтобы установить например 2x3, потом 3x4, а потом снова 2x3
        final GridLayout myGrid = new GridLayout(3,3);
        final JPanel content = new JPanel(myGrid);
        
        //content2 это моя вторая панель с двумя эдитами в который какраз и вводятся размеры матрици
        //и с такими размерами и нужно сделать GridLayout у content первой
        final JPanel content2 = new JPanel(new GridLayout(0,3));
        
        //два поля для размеров по x и по y
        final JTextField xSize = new JTextField("3");
        final JTextField ySize = new JTextField("3");
        
        content2.add(new JLabel("Введите x и y:"));
        content2.add(xSize);
        content2.add(ySize);
        
        //кнопка для применения действия
        final JButton ok = new JButton("OK");
        ok.addChangeListener(new ChangeListener()
        {
            @Override
            //когда состояние кнопки меняется нужно заставить GridLayout в content стать размера X x Y
            public void stateChanged(ChangeEvent arg0) 
            {
                //размер по умолчанию
                int x = 3;
                int y = 3;
                try
                {
                    x = Integer.parseInt(xSize.getText());
                    y = Integer.parseInt(ySize.getText());
                }
                catch(NumberFormatException ex)
                {
                    x = 3;
                    y = 3;
                }
                //генерация матрици, ничего интересного (хоть и сделано через задницу)
                gen.ChangeMatrixSize(x, y, 0);
                for(int i=1;i<=x;i++)
                    for(int j=1;j<=y;j++)
                        try 
                        {
                            gen.Set(i, j, i*j);
                        }
                
                        catch (WrongArgumentException e) 
                        {
                            e.printStackTrace();
                        }
                
                //очистка содержимого content
                content.removeAll();
                myGrid.setColumns(3);//не помогает, сетка в content по прежнему формируется по старому
                
                //заполнение content содержимым, но GridLayout по прежнему размещает это не так как надо
                //(надо чтобы он разместил это матрицей X x Y, а не как попало)
                for(int i=0; i<gen.xSize(); i++)
                    for(int j=0; j<gen.ySize(); j++)
                        try 
                        {
                            content.add(createComponent(gen.Get(i+1, j+1)));
                        }
                        catch (WrongArgumentException e) 
                        {
                            e.printStackTrace();
                        }
                content.setVisible(false);
                content.setVisible(true);
            }
        });
        content2.add(ok);
        
       
        
        content.setBorder(BorderFactory.createLineBorder(Color.red));
        getContentPane().add(content, BorderLayout.CENTER);
        getContentPane().add(content2, BorderLayout.NORTH);
        
        setSize(410, 220);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }
 
    private JComponent createComponent(int number){
        JLabel lbl = new JLabel(""+number);
        lbl.setPreferredSize(new Dimension(100, 50));
        lbl.setHorizontalAlignment(JLabel.CENTER);
        lbl.setBorder(BorderFactory.createLineBorder(Color.blue, 3));
        return lbl;
    }
}
Подскажите пожалуйста что поправить либо покажите в виде кода как прицепить два едита и сетку после них, которая будет менять размеры в зависимости от цифер введённых в едиты.

Добавлено через 6 часов 35 минут
Повторюсь: мне подойдёт тупо любое решение где будет возможность динамически рисовать сетку MxN с возможностью задать её размеры в каких-нибудь эдитбоксах во время выполнения. В принципе мне пофиг какой компоновщик использовать или каким тупым решением это всё будет, мне надо хоть как-то
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.12.2012, 23:58
Ответы с готовыми решениями:

Создание видимой сетки в Grid
Пример книги демонстрирует как через код xaml создавать в Grid сетку: &lt;Grid...

Grid выравнивание контента внутри сетки
&lt;div class=&quot;fin-othet-wrapper&quot;&gt; &lt;div class=&quot;fin-othet-block&quot;&gt;Дата&lt;/div&gt; &lt;div...

Перемещение динамически созданной кнопки по динамически созданной сетки
Всем привет!!! Помогите не могу допетрить как сделать. суть моей проблемы в том что, мне необходимо...

Как реализовать изменение сетки Grid через код?
Всем привет! Как можно сделать так, чтобы можно было менять размер сетки Grid? примерно как на...

7
512 / 454 / 119
Регистрация: 17.02.2012
Сообщений: 1,032
Записей в блоге: 1
09.12.2012, 10:50 2
а если так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class Grid extends JFrame{
    JPanel panSouth;
    JPanel panCenter;
    JButton but;
    JTextField tf1;
    JTextField tf2;
    JLabel[] grid;
    
    Grid(){
        super();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 450);
        setLayout(new BorderLayout());
        
        panSouth = new JPanel();
        tf1 = new JTextField(5);
        tf2 = new JTextField(5);
        but = new JButton("Change");
        panSouth.add(new JLabel("X: "));
        panSouth.add(tf1);
        panSouth.add(new JLabel("Y: "));
        panSouth.add(tf2);
        panSouth.add(but);
        add(panSouth, BorderLayout.SOUTH);
        
        but.addActionListener(new ActionListener() {
            int x;
            int y;
            @Override
            public void actionPerformed(ActionEvent e) {
                if (!tf1.getText().isEmpty() && !tf2.getText().isEmpty()){
                    x = Integer.parseInt(tf1.getText());
                    y = Integer.parseInt(tf2.getText());
                    panCenter = new JPanel(new GridLayout(y, x));
                    grid = new JLabel[x*y];
                    for (int i = 0; i<grid.length; i++){
                        grid[i] = new JLabel();
                        grid[i].setBorder(BorderFactory.createLineBorder(Color.black));
                        panCenter.add(grid[i]);
                    }
                    add(panCenter, BorderLayout.CENTER);
                    revalidate();
                }
                
            }
        });
    }
    public static void main(String[] args) {
        new Grid().setVisible(true);
    }
 
}
Только сделать еще обработку размера - 0
1
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
09.12.2012, 16:15  [ТС] 3
Drygba, спасибо, но не могу проверить код - ругаеться что addChangeListener у кнопки не принимает ActionListener как аргумент, я не особо разбираюсь в явовских этих всех событиях связанных с gui, как это исправить? Или я может чего не того импортировал:
Java
1
2
3
4
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.event.ChangeListener;
Ругается, как выше было сказано на эту строку
Java
1
 but.addChangeListener(new ActionListener() {... }
0
512 / 454 / 119
Регистрация: 17.02.2012
Сообщений: 1,032
Записей в блоге: 1
09.12.2012, 16:18 4
как ругается, что пишет?
1
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
09.12.2012, 21:04  [ТС] 5
Цитата Сообщение от Drygba Посмотреть сообщение
как ругается, что пишет?
Ну как я и говорил
Цитата Сообщение от Gepar Посмотреть сообщение
ругаеться что addChangeListener у кнопки не принимает ActionListener как аргумент
Ругается и нетбинс и эклипс.
Миниатюры
Динамически менять размеры Сетки (Grid)   Динамически менять размеры Сетки (Grid)  
0
512 / 454 / 119
Регистрация: 17.02.2012
Сообщений: 1,032
Записей в блоге: 1
09.12.2012, 23:13 6
тьфу, а причем тут
Java
1
addChangeListener
если надо
Java
1
addActionListener
1
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
10.12.2012, 01:25  [ТС] 7
Drygba, спасибо. А ещё вопрос сюда же: как запретить ввод чего-то кроме цифр? Опций "толкьо цифры" я так понимаю ждать не надо как у ms в mfc/net, значит нужно событие на ввод в эдиты запрещающее вводить что-либо кроме цифр. Допустим как узнать цифра или нет я знаю, а как запретить ввод остального ну и как ловить этот самый ввод подскажи пожалуйста, я так быстро это в книгах сам не найду пока что. Я основательное изучение этого всего отложил на конец сессии, те на время после НГ.
0
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
10.12.2012, 12:54 8
Цитата Сообщение от Gepar Посмотреть сообщение
А ещё вопрос сюда же: как запретить ввод чего-то кроме цифр? Опций "толкьо цифры" я так понимаю ждать не надо как у ms в mfc/net, значит нужно событие на ввод в эдиты запрещающее вводить что-либо кроме цифр. Допустим как узнать цифра или нет я знаю, а как запретить ввод остального ну и как ловить этот самый ввод подскажи пожалуйста
У текстового поля есть модель - Document. Берете реализацию - PlainDocument, переопределяете у него insertString. В этом методе фильтруете входящий параметр строку, оставляя в нем только то, что нужно пропустить (цифры), после чего вызываете родительский метод insertString, но уже со скорректированной строкой. Вот где-то так:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package ru.skipy.test;
 
import javax.swing.text.*;
 
/**
 *
 * @author Eugene Matyushkin aka Skipy
 */
class NumericDocument extends PlainDocument {
 
    private boolean allowDecimal;
 
    /**
     * Creates a new instance of NumericDocument
     *
     * @param allowDecimal if this document allows decimal point
     */
    public NumericDocument(boolean allowDecimal) {
        super();
        this.allowDecimal = allowDecimal;
    }
 
 
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
        StringBuffer sb = new StringBuffer(str.length());
        for(char c : str.toCharArray()){
            if (c < 256 && Character.isDigit(c))
                sb.append(c);
            if (allowDecimal && c == '.')
                sb.append(c);
        }
        super.insertString(offs, sb.toString(), a);
    }
}
2
10.12.2012, 12:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.12.2012, 12:54
Помогаю со студенческими работами здесь

Фон елемента сетки (grid) на всю ширину viewport
Сайт планируется разбить гридом. Нужно, чтоб фон (градиент или сплошная заливка) строк била...

Показ/скрытие линий колонок сетки Grid у отдельных ячеек
Есть форма , на которой есть сетка Grid. Линии сетки показываются пунктиром с помощью свойства Grid...

Как узнать размеры Grid
Здравствуйте! Собственно, нужна ваша помощь в том, как узнать размеры Grid из кода. Когда я...

Как настроить Post Grid, чтобы Главная блога с постами выводилась в виде сетки?
Здравствуйте! Проштудировала все инструкции, но что-то, видимо, упускаю. Поняла, как вставить...

Менять размеры LinearLayout пальцем
В Delphi/windows был компонент &quot;разделитель&quot;, схватив который можно было увеличить/уменьшить одну...

Как программно менять размеры фреймов?
Знает ли кто, как при помощи JavaScript менять абсолютные и относительные размеры фреймов? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru