gpt4 book ai didi

java - 指定Canvas在Swing中的位置

转载 作者:搜寻专家 更新时间:2023-10-31 20:04:38 25 4
gpt4 key购买 nike

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

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

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

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();
}



}

最佳答案

“Swing 程序应该覆盖 paintComponent() 而不是覆盖 paint()。”— Painting in AWT and Swing: The Paint Methods . JPanelJComponent 是常见的选择,如建议here .您可以使用合适的 layout 来控制放置.

附录:这与 Canvas 有什么关系?

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

image

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);
}
}
}

关于java - 指定Canvas在Swing中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12107163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com