有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有图形的java组件

我正在尝试创建一个JFrame,其中包含一个图像和一个文本框。我设法弄明白了文本框,但我搞不懂图像绘制。到目前为止,我有:

public class Patcher extends JFrame {

private static final long serialVersionUID = -431324639043295668L;
private JPanel contentPane;

private static JTextArea textArea;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Patcher frame = new Patcher();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public Patcher() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 319);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    contentPane.setLayout(new BorderLayout(0, 0));
    setContentPane(contentPane);

    textArea.setBackground(new Color(240, 240, 240));
    textArea.setText("123");
    contentPane.add(textArea, BorderLayout.SOUTH);

    JPanel panel = new JPanel();
    contentPane.add(panel, BorderLayout.NORTH);
    Image img = ImageIO.read(new URL(ClassLoader.getSystemResource("Icon_Entrey_21.png"), "img"));
    ImageObserver imgobs;
    panel.paintComponent(Graphics.drawImage(img, 0, 0, null));
    }
}

我的想法是创建一个JPanel,使用ClassLoader声明一个Image,并尝试使用paintComponent()方法以Graphics作为参数来绘制它。我做错了什么

我也尝试过创建一个new Graphics(),但它也会抛出一个错误


共 (1) 个答案

  1. # 1 楼答案

    1. 永远不要显式调用任何组件的paintComponent方法。如果您想进行自定义绘制,那么您可以创建一个自定义类来扩展JPanel/JComponent@Override方法paintComponent。详见Performing Custom Painting

      JPanel panel = new JPanel() {
          @Override
          protected void paintComponent(Graphics g) {
              super.paintComponent(g);
              g.drawImage(...);
          }
          // also override getPreferredSize()
      };
      
    2. 最简单、也可能更正确的解决方案是使用JLabelImageIcon而不是尝试定制绘画

      Image img = ImageIO.read(new URL(ClassLoader.getSystemResource("Icon_Entrey_21.png"), "img"));
      JLabel panel = new JLabel(new ImageIcon(img));
      contentPane.add(panel, BorderLayout.NORTH);