在面板内绘制图像

时间:2012-12-26 07:17:51

标签: java image swing jlabel

我有一个带两个按钮的面板。我正在尝试在面板中插入图像,我想在单击按钮后在图像内绘制线条。我使用了以下代码,但这似乎不起作用。

public class Try_Panel extends JFrame {
  // start attributes
  private JPanel jPanel1 = new JPanel(null, true);
  private JButton jButton1 = new JButton();
  private JButton jButton2 = new JButton();
  // end attributes

  public Try_Panel(String title) {
    // Frame-Init
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 300; 
    int frameHeight = 300;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);
    Container cp = getContentPane();
    cp.setLayout(null);
    // start components

    jPanel1.setBounds(48, 24, 209, 145);
    jPanel1.setOpaque(false);
    cp.add(jPanel1);
    jButton1.setBounds(88, 208, 75, 25);
    jButton1.setText("jButton1");
    jButton1.setMargin(new Insets(2, 2, 2, 2));
    jButton1.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        jButton1_ActionPerformed(evt);
      }
    });
    cp.add(jButton1);
    jButton2.setBounds(184, 208, 75, 25);
    jButton2.setText("jButton2");
    jButton2.setMargin(new Insets(2, 2, 2, 2));
    jButton2.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        jButton2_ActionPerformed(evt);
      }
    });
    cp.add(jButton2);
    // end components

    setVisible(true);
  } // end of public Try_Panel

  // start methods
  public void jButton1_ActionPerformed(ActionEvent evt) {
      BufferedImage image=new BufferedImage(jPanel1.getWidth(), jPanel1.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
        JLabel l=new JLabel(new ImageIcon(image));
        Graphics graphics = image.getGraphics();
        Graphics2D g = (Graphics2D) graphics;
        g.fillRect(0, 0, image.getWidth(), image.getHeight());
        g.setColor(Color.BLUE);
        g.drawLine(0, 0, 300, 400);
        jPanel1.add(l);
  } // end of jButton1_ActionPerformed

  public void jButton2_ActionPerformed(ActionEvent evt) {
    // TODO add your code here
  } // end of jButton2_ActionPerformed

  // end methods

  public static void main(String[] args) {
    new Try_Panel("Try_Panel");
  } // end of main

} // end of class Try_Panel

最大的问题是我的其他课程中使用的代码相同。

2 个答案:

答案 0 :(得分:3)

尝试在更新后image内包裹ImageIcon。此外,在完成渲染到图形上下文后,还应调用Graphics#dispose

public void jButton1_ActionPerformed(ActionEvent evt) {
    BufferedImage image=new BufferedImage(jPanel1.getWidth(), jPanel1.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
    Graphics2D g = image.createGraphics();
    g.fillRect(0, 0, image.getWidth(), image.getHeight());
    g.setColor(Color.BLUE);
    g.drawLine(0, 0, 300, 400);
    g.dispose();
    JLabel l=new JLabel(new ImageIcon(image));
    jPanel1.add(l);
}

您还应该依赖布局管理员,而不是自己尝试,只会让您的生活更轻松。

就我个人而言,我认为直接绘制到自定义组件更容易,例如JPanel。查看Performing Custom Painting了解更多详情

更新了示例

基本上,我将你的例子改为

  1. 使用布局管理器
  2. 在EDT的上下文中加载UI
  3. revalidate jPanel1
  4. public class BadLabel extends JFrame {
        // start attributes
    
        private JPanel jPanel1 = new JPanel(new BorderLayout(), true);
        private JButton jButton1 = new JButton();
        private JButton jButton2 = new JButton();
        // end attributes
    
        public BadLabel(String title) {
            // Frame-Init
            super(title);
            setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            int frameWidth = 300;
            int frameHeight = 300;
            setSize(frameWidth, frameHeight);
            Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
            int x = (d.width - getSize().width) / 2;
            int y = (d.height - getSize().height) / 2;
            setLocation(x, y);
    //        setResizable(false);
            Container cp = getContentPane();
    //        cp.setLayout(null);
            // start components
    
    //        jPanel1.setBounds(48, 24, 209, 145);
            jPanel1.setOpaque(true);
            jPanel1.setBackground(Color.RED);
            cp.add(jPanel1);
    
            JPanel buttons = new JPanel();
    //        jButton1.setBounds(88, 208, 75, 25);
            jButton1.setText("jButton1");
            jButton1.setMargin(new Insets(2, 2, 2, 2));
            jButton1.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    jButton1_ActionPerformed(evt);
                }
            });
            buttons.add(jButton1);
    //        jButton2.setBounds(184, 208, 75, 25);
            jButton2.setText("jButton2");
            jButton2.setMargin(new Insets(2, 2, 2, 2));
            jButton2.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    jButton2_ActionPerformed(evt);
                }
            });
            buttons.add(jButton2);
            // end components
    
            cp.add(buttons, BorderLayout.SOUTH);
    
            setVisible(true);
        } // end of public BadLabel
    
        // start methods
        public void jButton1_ActionPerformed(ActionEvent evt) {
            BufferedImage image = new BufferedImage(jPanel1.getWidth(), jPanel1.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
            Graphics2D g = image.createGraphics();
            g.fillRect(0, 0, image.getWidth(), image.getHeight());
            g.setColor(Color.BLUE);
            g.drawLine(0, 0, 300, 400);
            g.dispose();
            JLabel l = new JLabel(new ImageIcon(image));
            l.setBorder(new LineBorder(Color.BLUE));
            jPanel1.add(l);
            jPanel1.revalidate();
        } // end of jButton1_ActionPerformed
    
        public void jButton2_ActionPerformed(ActionEvent evt) {
            // TODO add your code here
        } // end of jButton2_ActionPerformed
    
        // end methods
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (Exception exp) {
                    }
                    new BadLabel("BadLabel");
                }
            });
        } // end of main
    } // end of class BadLabel}
    

答案 1 :(得分:1)

这样的事情:

Try_Panel

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.border.EmptyBorder;

public class Try_Panel {
    // start attributes

    private JButton jButton1 = new JButton("jButton1");
    private JButton jButton2 = new JButton("jButton2");
    private JLabel imageView;
    BufferedImage image;
    int x = 300;
    int y = 50;
    // end attributes

    public Component getGui() {
        JPanel gui = new JPanel(new BorderLayout(5, 5));
        gui.setBorder(new EmptyBorder(3, 3, 3, 3));

        image = new BufferedImage(300, 100, BufferedImage.TYPE_INT_RGB);
        imageView = new JLabel(new ImageIcon(image));

        gui.add(imageView, BorderLayout.CENTER);

        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.CENTER, 15, 15));
        gui.add(buttons, BorderLayout.PAGE_END);

        jButton1.setMargin(new Insets(2, 2, 2, 2));
        jButton1.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent evt) {
                jButton1_ActionPerformed(evt);
            }
        });
        buttons.add(jButton1);

        jButton2.setMargin(new Insets(2, 2, 2, 2));
        jButton2.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent evt) {
                jButton2_ActionPerformed(evt);
            }
        });
        buttons.add(jButton2);
        // end components

        return gui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            public void run() {
                // Frame-Init
                JFrame f = new JFrame("Try Panel");
                f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);
                Container cp = f.getContentPane();
                cp.setLayout(new BorderLayout(3, 3));

                Try_Panel tp = new Try_Panel();
                cp.add(tp.getGui());

                f.pack();
                f.setMinimumSize(f.getSize());
                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    } // end of public Try_Panel

    // start methods
    public void jButton1_ActionPerformed(ActionEvent evt) {
        Graphics graphics = image.getGraphics();
        Graphics2D g = (Graphics2D) graphics;
        g.setColor(Color.RED);
        g.drawLine(0, 0, x, y);
        x -= 4;
        y += 2;
        g.dispose();

        imageView.repaint();
    } // end of jButton1_ActionPerformed

    public void jButton2_ActionPerformed(ActionEvent evt) {
        // TODO add your code here
    } // end of jButton2_ActionPerformed
} // end of class Try_Panel