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)
“Swing 程序应该重写paintComponent()而不是重写paint()。”\xe2\x80\x94在 AWT 和 Swing 中绘制:绘制方法。JPanel或JComponent是常见的选择,如此处建议的那样。您可以使用合适的布局来控制放置。
附录:这与 有何关系Canvas?
该类java.awt.Canvas是一个 AWT 组件;而是使用 Swing 组件javax.swing.JPanel。这是程序的一个变体,它仅选择随机颜色,但它可能会让您了解如何处理其他属性。这里有一个相关的例子。

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}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
2707 次 |
| 最近记录: |