ActionListener не работает должным образом после рисования линии в Java - PullRequest
1 голос
/ 16 октября 2011

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

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

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);

ну, есть предложения? :)

Ответы [ 2 ]

3 голосов
/ 16 октября 2011

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

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

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

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

windower.add(panel);

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

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

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

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

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

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

1 голос
/ 16 октября 2011
Graphics g = imadzysko.getGraphics();

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

...