[英]How to get components of a JPanel which inside another JPanel in java
[英]java, paint Jpanel, which is inside another JPanel
嗨,我用JTextArea制作了一个Fire Simulator http://xieu901.webs.com/fire.jar
现在我想用JPanel或Canvas而不是JTextarea来制作它(只是想挑战自己^^)我设法在Jframe中的唯一JPanel中绘制图像,但是我无法在Jframe中另一个JPanel中的Jpanel中绘制任何图像
有什么方法可以使用不扩展JComponent的paint方法? 而且我不知道如何创建一个新的Graphics对象
public class gui extends JComponent {
//create gui elements
MigLayout layout= new MigLayout("fillx,filly", "[70%,fill][30%,fill]","");
JLabel status = new JLabel("status");
JTextField sizeoffield = new JTextField();
JButton ok= new JButton("Start");
JButton reset= new JButton("Reset");
JButton update= new JButton("Update");
JPanel mainPanel = new JPanel(layout);
JPanel panel = new JPanel();
JFrame win = new JFrame("my win");
//constructor = create gui
gui(){
win.setVisible(true);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.setBounds(1,1,800,600);
panel.setPreferredSize(panel.getMaximumSize());//wichtig
win.add(mainPanel);
mainPanel.add(panel,"spany 4,align left,aligny top");
mainPanel.add(sizeoffield,"wrap");
mainPanel.add(ok,"wrap,aligny t");
mainPanel.add(reset,"wrap,aligny t");
mainPanel.add(update,"wrap,aligny t");
mainPanel.add(status);
panel.addMouseListener(mouse);
ok.addActionListener(listener);
reset.addActionListener(listener);
update.addActionListener(listener);
}
/*******a long code of mouse/actionlistener and other methods was cut here *******/
//load imageicon to convert to image later
private ImageIcon loadImage(String s) {
java.net.URL imgURL = gui.class.getResource(s);
return new ImageIcon(imgURL);
}
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.drawString("Java 2D", 50, 50);
g2d.drawRoundRect(1, 1, 100, 100, 100, 100);
g2d.setColor(Color.black);
g2d.fillRect(0, 0, this.getWidth(), this.getHeight());
g2d.drawImage(fire,1,1,50,50,null);
}
@Override
public void repaint() {
super.repaint();
}
public static void main(String[] args) {
new gui();
}
}
通过上面的代码,我得到了一个普通的JPanel(应该为黑色,因此我认为未使用paint方法)
这是我的代码,它是JFrame中的JPanel,它可以正常工作
package jpanel;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
public class Panel extends JComponent{ //class Panel
ImageIcon fireicon = loadImage("regen.png");
ImageIcon normalicon = loadImage("regen.png");
ImageIcon regenicon = loadImage("regen.png");
Image fire= fireicon.getImage();
Image normal= normalicon.getImage();
Image regen= regenicon.getImage();
private ImageIcon loadImage(String s) {
java.net.URL imgURL = gui.class.getResource(s);
return new ImageIcon(imgURL);
}
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.drawString("Java 2D", 50, 50);
g2d.drawRoundRect(1, 1, 100, 100, 100, 100);
g2d.setColor(Color.black);
g2d.fillRect(0, 0, this.getWidth(), this.getHeight());
g2d.drawImage(fire,1,1,50,50,null);
}
// @Override
// public void repaint() {
// super.repaint();
// }
public static void main(String[] args) {
JFrame win = new JFrame();
win.add(new Panel());
win.setVisible(true);
win.setSize(400, 400);
}
}
不,GUI的图形是通过摆动创建的。 该示例有效,并可能给您提示:
public static void main(String... args) {
JFrame frame = new JFrame("Test");
JPanel outer = new JPanel(new GridLayout(1, 1));
JPanel inner = new JPanel(new GridLayout(1, 1));
MyComponent component = new MyComponent();
frame.add(outer, BorderLayout.CENTER);
outer.add(inner);
inner.add(component);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
frame.setVisible(true);
}
static class MyComponent extends JComponent {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLACK);
Rectangle r = getBounds();
g.drawRect(r.x + 10, r.y + 10, r.width - 20, r.height - 20);
}
}
谢谢dacwe,您的代码帮助了我,现在我可以开始实际的工作了^^
package nad;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import jpanel.gui;
import net.miginfocom.swing.MigLayout;
class Componentprobe extends JComponent{
ImageIcon fireicon = loadImage("regen.png");
Image fire= fireicon.getImage();
private ImageIcon loadImage(String s) {
java.net.URL imgURL = gui.class.getResource(s);
return new ImageIcon(imgURL);
}
protected void paintComponent(Graphics g) {
// super.paintComponent(g);
//
// g.setColor(Color.BLACK);
// Rectangle r = getBounds();
// g.drawRect(r.x + 10, r.y + 10, r.width - 20, r.height - 20);
Graphics2D g2d = (Graphics2D) g;
g2d.drawString("Java 2D", 50, 50);
g2d.drawRoundRect(1, 1, 100, 100, 100, 100);
g2d.setColor(Color.black);
g2d.fillRect(0, 0, this.getWidth(), this.getHeight());
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
g2d.drawImage(fire,1+i*50,1+j*50,50,50,null);
}
}
}
public static void main(String[] args) {
JButton button1= new JButton("OK");
JButton button2= new JButton("reset");
JButton button3= new JButton("update");
MigLayout layout= new MigLayout("fillx,filly", "[70%,fill][30%,fill]","");
Componentprobe component = new Componentprobe();
JPanel panel = new JPanel(new GridLayout(1, 1)); //Miglayout or null layout wont work
JPanel main= new JPanel(layout);
JFrame win = new JFrame("component probe");
win.setVisible(true);
win.setSize(400, 400);
win.add(main);
main.add(panel,"spany 3,aligny top,align left");
panel.setPreferredSize(panel.getMaximumSize());//wichtig
panel.add(component);
main.add(button1,"wrap,aligny top");
main.add(button2,"wrap,aligny top");
main.add(button3,"aligny t");
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.setSize(400, 300);
win.setVisible(true);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.