java, функция repaint

274
28 февраля 2017, 15:58

Нарисовать сетку для тестирования монитора. По клику мыши на форме циклически менять цвета линий сетки в порядке: красный, синий, зеленый. Предусмотреть возможность изменения шага сетки.

package dialogtest;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.event.*;
public class DialogTest extends JFrame{
    JPanel panSouth;
    JPanel panCenter;
    JButton but;
    JTextField tf1;
    JTextField tf2;
    JLabel[] grid;
    private int colorIndex = 0;
    DialogTest(){
        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.RED));
                        panCenter.add(grid[i]);
                    }
                    add(panCenter, BorderLayout.CENTER);
                    revalidate();
                }
            }
        });
     //   repaint();
        addMouseListener (new MouseAdapter() {
         //   @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                // Клик
                int x=0;
                int y=0;    
                 x = Integer.parseInt(tf1.getText());
                 y = Integer.parseInt(tf2.getText());
                Color color;              
                colorIndex = colorIndex + 1;
                if (colorIndex > 2) {
                    colorIndex = 0;
                }
                switch (colorIndex) {
                    case 0:color = Color.RED;break;
                    case 1:color = Color.BLUE;break;
                    case 2:color = Color.GREEN;break;
                    default:color = Color.RED;break;
                }
                // System.out.println("mouseClicked ->" + e.getX() + "->" + e.getY());
                for (int i = 0; i<x*y; i++){
                    grid[i].setBorder(BorderFactory.createLineBorder(color));
                }
            //  revalidate();
                 repaint();
            }      
        });
    }
    public static void main(String[] args) {
        new DialogTest().setVisible(true);     
    } 
}

При изначальном размере сетки цвет нормально меняется, а при изменении шага сетки нажатие мышки на форму меняет цвет на начальный. В чем может быть ошибка?

Answer 1

Добавьте между вот этих строк

y = Integer.parseInt(tf2.getText());
panCenter = new JPanel(new GridLayout(y, x));

Вот это

if(panCenter != null) {
    remove(panCenter);
}

И все заработает

Ваша ошибка в том, что вы не замещаете старую сетку, а добавляете еще одну. И при перерисовке ваша старая сетка появляется, а новая сетка рисуется за границей видимой области. Если вы растянете окно, то увидите ее.

READ ALSO
Помогите разобраться с sqlite

Помогите разобраться с sqlite

Помогите разобраться с СУБД: создал коннект для подключения БД к проекту, вот мой путь "url = "jdbc:sqlite:TEST1s3db"

252
java.lang.NullPointerException

java.lang.NullPointerException

не могу понять, в чем проблема

263
Не правильно работает matcher java

Не правильно работает matcher java

Есть HTML-шаблон письма и регулярное выражение, которое работает на regex101com

318
Обращение к сервлёту из приложения

Обращение к сервлёту из приложения

Как можно обратится к сервлёту из андроид приложения и вызвать методы doGet(), doPost()?

271