ActionListener не работает должным образом после рисования линии в Java

У меня проблема со слушателем действия после того, как я рисую линию, в основном это работает только один раз, например, мое приложение загружает изображение, чем вы выбираете две точки, сначала левой кнопкой мыши, затем правой кнопкой, а затем нажмите кнопку «соединить точки», и она начнет рисовать линию. И это работает, я могу сделать это со многими строками и т. Д. НО, когда я закрываю окно с изображением и перезагружаю его, кнопка «точки подключения» перестает работать. Дк, что с этим делать. Вот код:

часть линии покраски:

public void paint(Graphics g) {

 super.paint(g);
    myPaint(g);  
 }

 private void myPaint(Graphics g) {
    g.drawLine(lx1, ly1, px2, py2);
 }
}

Часть ActionListener:

public void actionPerformed(ActionEvent e) {

    if(e.getSource()==painterka){

       Graphics g = imadzysko.getGraphics();
          paint(g);
            lx1=0;
            ly1=0;
            px2=0;
            py2=0;    
       }
 }

Панель с графической частью:

void diagramKY (JFrame windower, String tyt, String content) {
    Listener listener = new Listener(); 

    panelik.setLayout(null);
    painterka =  new JButton("Connect Points");
    windower = new JFrame("");
    windower.setTitle(tyt+" - diagram");
    windower.setSize(800, 600);
    windower.setVisible(true);
    windower.setLocationRelativeTo(null);
    URLdownloader.fileUrl("http://stooq.pl/c/?s="+content+"&c=1d&t=l&a=lg",
             content+".png","");
    imadzysko = new ImagePanel(new ImageIcon(content+".png").getImage());
    panelik.add(imadzysko);
    panelik.add(painterka);
    imadzysko.addMouseListener(new MyMouseListener());
    painterka.addActionListener(listener);
    Insets insets = panelik.getInsets();
    Dimension size = imadzysko.getPreferredSize();
    imadzysko.setBounds(20 + insets.left, 20 + insets.top,
        size.width, size.height);
    size = painterka.getPreferredSize();
    painterka.setBounds(630 + insets.left, 20 + insets.top,
        size.width, size.height);
    panelik.repaint();
    imadzysko.repaint();
    windower.add(panelik);

ну какие предложения? :)

java,drawing,line,jbutton,actionlistener,

1

Ответов: 2


3 принят

1) создайте панель, поместите это в графический интерфейс и последние строки кода будут

windower.setLocationRelativeTo(null);
windower.setVisible(true);

иначе ваша панель никогда не будет видна на экране

2) не используйте setBounds () и т. Д., Для этого существует LayoutManager

windower.add(panel);

тогда ваша панель заполняет всю область JFrame

3) никогда не используйте paint(Graphics g)в коде Swing, используйте только, paintComponent(Graphics g)чтобы избежать непредвиденного вывода в GUI

4) не создавайте новые контейнеры верхнего уровня во время выполнения, для всплывающего окна создайте только один JDialog или JWindow и повторно используйте его для другого действия

5) у вас есть проблемы с Concurency в Swing , зависанием вашего графического интерфейса, потому что ожидание жесткого и долгого кода реализует SwingWorker , есть пример, похожий на этот

6) если вы хотите отобразить несколько картинок или изображений, ищите Icon, размещенный в JLabel

7) действительно необходимо прочитать руководство по 2D-графике, прежде чем размещать вопрос здесь


Graphics g = imadzysko.getGraphics();

Никогда не делай этого. Графический интерфейс Java должен рисовать, когда сказано сделать это. Когда это время придет, paint(Graphics)или paintComponent(Graphics)будет вызван. Сделай картину тогда.

Java, рисунок, линия, JButton, ActionListener,
Похожие вопросы