Java:在动作侦听器中使用图形组件

时间:2017-02-10 23:03:50

标签: java swing jframe jbutton

我已经与Diferent JButtons制作了一个JFrame,我想从另一个类中获取一个图像。有任何想法吗?或者如何在同一个类上绘制但是在执行的操作上? 因为它不允许我做任何图纸......我的编译器总是给我错误信息

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.*;

public class red extends JFrame {

    public JButton b;
    public JButton b1;
    public JButton b2;
    public JButton b3;
    public JButton b4;

    public static Image p;
    public static Graphics g;
    public red() throws IOException {
        gui1 x = new gui1();
        setTitle(" ");
        setSize(1200,700);
        setLayout(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        b= new JButton("click");
        b1= new JButton();
        b.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e0){    
                b1.setBounds(0, 0, 200, 200);
                b.show(false);
                add(x);
            }       
        });
        b.setBounds(0, 0, 100, 100);
        add(b1);
        add(b);

        setVisible(true);
    }

    public static void main(String[] args) throws IOException  {
        red k = new red();
    }
}
import java.awt.*;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.*;

public class gui1 extends Canvas {

    public static Image p;

    public void paint(Graphics g){
        g.drawImage(p, 700, 200, 100, 100, this);
    }

    {
        try {
            p= ImageIO.read(new File("Lighthouse.jpg"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

1 个答案:

答案 0 :(得分:5)

唷!我在您的代码中看到很多错误(即使我更正了编译错误):

  1. 您没有关注Java naming conventions

      

    类名应该是名词,大小写混合,每个内部单词大写的第一个字母

    虽然red是名词,但它应该更具描述性并且大写。 gui1

  2. 也是如此
  3. 您正在扩展JFrame,用简单的英语说:red JFrame,您应该真的避免这种情况,创建基于JPanel的GUI而不是...请参阅Java Swing using extends JFrame vs callint it inside of class

  4. 您正在设置尺寸(对于您正在使用的JButton尺寸,这是一个可以重新设置的大窗口,而是使用pack()

  5. 您正在使用null-layout,而像素完美的图形用户界面似乎是为Swing新手创建复杂图形用户界面的最简单方法,您使用它们越多,与此相关的问题就越多#&# 39;将来会发现它们很难维护并导致随机问题,它们不会调整大小等等。请阅读Null layout is evilWhy is it frowned upon to use a null layout in Swing?以获取有关为什么要避免其问题的更多信息使用以及为什么要更改GUI以使用Layout Managers以及Empty Borders来获取组件之间的额外间距。

  6. 您正在使用已弃用的方法JFrame#show(),而应该使用JFrame#setVisible(...)

  7. 与第4点相关,您不应该调用setBounds(...)方法,而是将这些计算交给布局管理员。

  8. 您没有将您的程序放在Event Dispatch Thread (EDT)上,Swing不是线程安全的,您可以通过更改main()方法来解决此问题:

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                //Your constructor here
            }
        });
    }
    
  9. 您正在混合AWT和Swing组件,而不是使用AWT'}使用具有更多功能和支持的Swing Canvas

  10. 图像一旦被打包到JAR文件中就会成为嵌入式资源,因此开始将它们视为已经存在,而不是像 JPanel tag。

  11. Canvas更改为JPanel后,您应该覆盖其embedded-resource方法,而不是paintComponent(...)并将其称为super.paintComponent(g)方法作为第一行,也不要忘记添加@Overrides注释。请参阅paint(...)

  12. 您滥用static关键字,请参阅tutorial on Swing custom painting

  13. 在看到上述所有错误后,我建议您在开始使用图形环境之前返回并使用该语言的how does the static keyword works?,这只会给您的学习带来更多困难。

    根据我的理解,您希望在点击按钮上绘制图像,如果是这样,那么您可以将图像包裹在JLabel中并将JLabel添加到{ {1}}然后添加到父JPanel,后来添加到JPanel

    Learn the basics

    正如您在上面的GIF中所看到的,用户按下按钮后会显示图标。

    显然,可以改进这一点,使GUI更具吸引力"如前所述,布局管理器和空边框的组合。

    使用以下代码完成:

    JFrame