在Swing中指定Canvas的位置

Ale*_*lex 5 java user-interface swing jpanel jframe

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

更具体地说:我创建了一个Canvas使用Paint方法的类.此类的对象将添加到Panel中.我不太明白的是,它是如何以及在何处添加到Panel中的.在Tkinter中Canvas是一个仅包含图像的小部件,但在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();
    }



}
Run Code Online (Sandbox Code Playgroud)

tra*_*god 4

“Swing 程序应该重写paintComponent()而不是重写paint()。”\xe2\x80\x94在 AWT 和 Swing 中绘制:绘制方法JPanelJComponent是常见的选择,如此处建议的那样。您可以使用合适的布局来控制放置。

\n\n

附录:这与 有何关系Canvas

\n\n

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

\n\n

图像

\n\n
import java.awt.BorderLayout;\nimport java.awt.Color;\nimport java.awt.Dimension;\nimport java.awt.EventQueue;\nimport java.awt.Graphics;\nimport java.awt.event.ActionEvent;\nimport java.awt.event.ActionListener;\nimport java.util.Random;\nimport javax.swing.JButton;\nimport javax.swing.JFrame;\nimport javax.swing.JLabel;\nimport javax.swing.JOptionPane;\nimport javax.swing.JPanel;\nimport javax.swing.JTextField;\n\npublic class MainCode {\n\n    public static void main(String args[]) {\n        EventQueue.invokeLater(new Runnable() {\n\n            @Override\n            public void run() {\n                MainView fc = new MainView();\n            }\n        });\n    }\n\n    private static class MainView implements ActionListener {\n\n        private JFrame f = new JFrame();\n        private JButton colorButton = new JButton("Color");\n        private JButton quitButton = new JButton("Quit");\n        private JButton infoButton = new JButton("Info");\n        private JLabel x_loc = new JLabel("X:");\n        private JLabel y_loc = new JLabel("Y:");\n        private JLabel w_label = new JLabel("Width:");\n        private JLabel h_label = new JLabel("Height:");\n        private JTextField x_loc_box = new JTextField("0");\n        private JTextField y_loc_box = new JTextField("0");\n        private JTextField w_loc_box = new JTextField("100");\n        private JTextField h_loc_box = new JTextField("100");\n        private JOptionPane info1 = new JOptionPane();\n        private JPanel panel1 = new JPanel();\n        private JPanel panel2 = new JPanel();\n        private GraphicsClass graphicsClass = new GraphicsClass();\n\n        public MainView() {\n            panel1.add(x_loc);\n            panel1.add(x_loc_box);\n            panel1.add(y_loc);\n            panel1.add(y_loc_box);\n            panel1.add(w_label);\n            panel1.add(w_loc_box);\n            panel1.add(h_label);\n            panel1.add(h_loc_box);\n            colorButton.addActionListener(this);\n            quitButton.addActionListener(this);\n            infoButton.addActionListener(this);\n            panel2.add(colorButton);\n            panel2.add(quitButton);\n            panel2.add(infoButton);\n            f.add(panel1, BorderLayout.NORTH);\n            f.add(graphicsClass, BorderLayout.CENTER);\n            f.add(panel2, BorderLayout.SOUTH);\n            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\n            f.setTitle("Graphics Toolbox v2");\n            f.pack();\n            f.setLocationRelativeTo(null);\n            f.setVisible(true);\n        }\n\n        @Override\n        public void actionPerformed(ActionEvent e) {\n            if (e.getSource() == infoButton) {\n                JOptionPane.showMessageDialog(f, "hahahahahaha");\n            } else if (e.getSource() == quitButton) {\n                System.exit(0);\n            } else if (e.getSource() == colorButton) {\n                graphicsClass.randomColor();\n                graphicsClass.repaint();\n            }\n        }\n    }\n\n    private static class GraphicsClass extends JPanel {\n\n        private static final int SIZE = 128;\n        private static final Random r = new Random();\n        private Color color = Color.green;\n\n        @Override\n        public Dimension getPreferredSize() {\n            return new Dimension(SIZE, SIZE);\n        }\n\n        public void randomColor() {\n            this.color = new Color(r.nextInt());\n        }\n\n        @Override\n        public void paintComponent(Graphics g) {\n            super.paintComponent(g);\n            g.setColor(color);\n            int w = getWidth();\n            int h = getHeight();\n            g.fillArc(0, h / 4, w, h, 45, 90);\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n