5

我正在学习 Swing GUI 设计。我还没有完全解决的一件事是如何将添加添加Canvas到容器中的特定位置。

更具体地说:我创建了一个Canvas使用Paint方法的类。此类的对象被添加到面板中。我不太明白的是,它是如何以及在何处添加到面板的。在 TkinterCanvas中是一个仅包含图像的小部件,但在 Swing 中,没有类似的小部件(可能不是最好的词)添加到仅包含 Canvas 对象而没有其他内容的 Frame 中。

对不起,如果它太模糊,我正在添加一个独立的代码。请忽略文本字段和标签。

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JTextField;

//frame class
class frame_class2 extends JFrame implements ActionListener{
  //declare buttons
  JButton draw_button = new JButton("Draw");
  JButton quit_button= new JButton("Quit");
  JButton info_button = new JButton("Info");
  //declare labels
  JLabel x_loc = new JLabel("X:");
  JLabel y_loc = new JLabel("Y:");
  JLabel w_label= new JLabel("Width:");
  JLabel h_label = new JLabel("Height:");
  //Layout
  FlowLayout layout_frame1 = new FlowLayout();
  //Text boxes
  JTextField x_loc_box = new JTextField("0");
  JTextField y_loc_box = new JTextField("0");
  JTextField w_loc_box = new JTextField("100");
  JTextField h_loc_box = new JTextField("100");
  //Info 
  JOptionPane info1 = new JOptionPane();
  //Canvas
  //Canvas area1 = new Canvas();
  //Containers
  JPanel panel1 = new JPanel();
  JPanel panel2= new JPanel();
  //Container container3 = new Container();
  Container con = getContentPane();


  public frame_class2(){    
    //panel1 = getContentPane();
    //add(area1);
    //add labels to the first panel
    panel1.setLayout(layout_frame1);
    panel2.setLayout(layout_frame1);
    panel1.add(x_loc);
    panel1.add(x_loc_box);
    panel1.add(y_loc);
    panel1.add(y_loc_box);
    panel1.add(w_label);
    panel1.add(w_loc_box);
    panel1.add(h_label);
    panel1.add(h_loc_box);
    //add buttons to the second panel
    draw_button.addActionListener(this);
    quit_button.addActionListener(this);
    info_button.addActionListener(this);
    panel2.add(draw_button);
    panel2.add(quit_button);
    panel2.add(info_button);

    con.add(panel1, BorderLayout.NORTH);
    //con.add(new JSeparator(), BorderLayout.CENTER);

    con.add(panel2, BorderLayout.SOUTH);
    setDefaultCloseOperation(super.EXIT_ON_CLOSE);
    setTitle("Graphics Toolbox v2");
     //Set up the content pane.
      //this.getContentPane();
    pack();
    //setSize(500, 500);
    setLocationRelativeTo(null);
    //setBackground(Color.BLUE);
    setVisible(true);
  }

  @Override
  public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    if (e.getSource()==info_button){
        info1.showMessageDialog(this, "hahahahahaha"); 
    }
    else if (e.getSource()==quit_button){
        System.exit(0);
    }
    else if (e.getSource()==draw_button){

        graphics_class2 input1 = new graphics_class2();
        con.add(input1);        
        //info1.showMessageDialog(this, "Not yet!");

    }


  }



}

//graphics class
class graphics_class2 extends Canvas{

  public graphics_class2(){
    //frame_class1 inst1 = new frame_class1();
    //Canvas img1 = inst1.area1;
    setSize(50,50);
    //setBackground(Color.BLUE);
  }

  public void paint(Graphics g){
    super.paint(g); 
    g.setColor(Color.GREEN);
    g.fillArc(0, 0, 50, 50, 50, 50);

  }



}



public class main_code {

    public static void main(String args[]){
    frame_class2 inst1 = new frame_class2();
    }



}
4

2 回答 2

4

“Swing 程序应该覆盖paintComponent()而不是覆盖paint()。”—<a href="http://java.sun.com/products/jfc/tsc/articles/painting/index.html#callbacks" rel="nofollow noreferrer">绘画在 AWT 和 Swing:绘制方法中。JPanel或者JComponent是常见的选择,如此处所建议。您可以使用合适的布局控制布局

附录:这有什么关系Canvas

该类java.awt.Canvas是一个 AWT 组件;而是使用 Swing 组件javax.swing.JPanel。这是您的程序的一个变体,它仅选择随机颜色,但它可能会让您了解如何处理其他属性。这里有一个相关的例子。

图片

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class MainCode {

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                MainView fc = new MainView();
            }
        });
    }

    private static class MainView implements ActionListener {

        private JFrame f = new JFrame();
        private JButton colorButton = new JButton("Color");
        private JButton quitButton = new JButton("Quit");
        private JButton infoButton = new JButton("Info");
        private JLabel x_loc = new JLabel("X:");
        private JLabel y_loc = new JLabel("Y:");
        private JLabel w_label = new JLabel("Width:");
        private JLabel h_label = new JLabel("Height:");
        private JTextField x_loc_box = new JTextField("0");
        private JTextField y_loc_box = new JTextField("0");
        private JTextField w_loc_box = new JTextField("100");
        private JTextField h_loc_box = new JTextField("100");
        private JOptionPane info1 = new JOptionPane();
        private JPanel panel1 = new JPanel();
        private JPanel panel2 = new JPanel();
        private GraphicsClass graphicsClass = new GraphicsClass();

        public MainView() {
            panel1.add(x_loc);
            panel1.add(x_loc_box);
            panel1.add(y_loc);
            panel1.add(y_loc_box);
            panel1.add(w_label);
            panel1.add(w_loc_box);
            panel1.add(h_label);
            panel1.add(h_loc_box);
            colorButton.addActionListener(this);
            quitButton.addActionListener(this);
            infoButton.addActionListener(this);
            panel2.add(colorButton);
            panel2.add(quitButton);
            panel2.add(infoButton);
            f.add(panel1, BorderLayout.NORTH);
            f.add(graphicsClass, BorderLayout.CENTER);
            f.add(panel2, BorderLayout.SOUTH);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setTitle("Graphics Toolbox v2");
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == infoButton) {
                JOptionPane.showMessageDialog(f, "hahahahahaha");
            } else if (e.getSource() == quitButton) {
                System.exit(0);
            } else if (e.getSource() == colorButton) {
                graphicsClass.randomColor();
                graphicsClass.repaint();
            }
        }
    }

    private static class GraphicsClass extends JPanel {

        private static final int SIZE = 128;
        private static final Random r = new Random();
        private Color color = Color.green;

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(SIZE, SIZE);
        }

        public void randomColor() {
            this.color = new Color(r.nextInt());
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(color);
            int w = getWidth();
            int h = getHeight();
            g.fillArc(0, h / 4, w, h, 45, 90);
        }
    }
}
于 2012-08-24T10:41:43.833 回答
1

将画布附加到此面板的末尾。组件已添加到已显示的容器中,validate必须在该容器上调用才能显示新组件。

于 2012-08-24T10:10:13.123 回答