我正在制作一个简单的GUI,其中小方框应根据其x,y坐标显示在vals_list_low = []
vals_list_high = []
i = -1
for x, y, z in lst:
if z == "low":
vals_list_min.append(lst[:i])
if z == "high":
vals_list_max.append(lst[:i])
i += 1
上。所以我在我的结构中有三个班级:
1:Jpanel
,其中包含主MyFrame
2:JFrame
3:MyPanel extends JPanel
在我的Icon extends JComponent
我希望有一个MyFrame
我可以通过它打开一个X,Y坐标文件,在菜单栏下面我希望有MenuBar
每个X,Y坐标的所有MyPanel
。我遇到的第一个问题是,当我添加图标时,Icons
不会出现在Icon
上。
我的代码可以在下面看到:
MyPanel
代码用于保存图标的面板:
public class MyFrame {
private JFrame frame;
private MyPanel panel;
public MyFrame(){
panel = new MyPanel();
}
/*
*HERE GOES THE `FILE OPEN` LISTENER
* it creates `Coordinate` for each line
* passes the coordinate to panel.makeIcons()
*/
public void createGui(){
frame = new JFrame("Graph Editor");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setResizable(true);
//create, get and set the Jframe menu bar
//createMenuBar() returns a JMenuBar
frame.setJMenuBar(createMenuBar());
Container frame_pane = frame.getContentPane();
panel.setBounds(0, 0, frame.getWidth(), frame.getHeight());
frame_pane.add(panel);
frame.pack();
frame.setVisible(true);
}
public static void main(String args[]){
MyFrame window = new MyFrame();
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
window.createGui();
}
});
}
}
需要在上面的面板上显示的Icon代码:
public class MyPanel extends JPanel{
private Set<Icon> points;
public MyPanel(){
setLayout(null);
setPreferredSize(new Dimension(600, 600));
setBackground(Color.YELLOW);
}
//gets called by `FILE OPEN` listener for each coordinate
public void makeIcons(Coordinate obj){
Icon temp = new Icon(obj);
points.add(temp);
//add the temp JComponent to this JPanel
this.add(temp);
}
}
第一个问题:图标没有显示在面板中,上面的代码。
第二个问题:当我将public Icon extends JComponent{
private Coordinate location;
public Icon(Coordinate obj){
location = obj;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.fillRect(location.getX(), location.getY(), 20, 20);
g.setColor(Color.BLACK);
g.drawRect(location.getX(), location.getY(), 20, 20);
}
}
中的makeIcon
方法更改为以下时。当MyPanel.class
出现在任何图标上时,它会显示Icons
MenuBar
删除它们:
MenuBar
感谢任何帮助。感谢
答案 0 :(得分:2)
不要自己调用paintComponent(或任何paint)方法。这不是绘画的工作原理。
组件不会被绘制的核心原因是:
根据我的简短观察,我会说你遇到第1点,部分原因是因为使用了空布局
另外,请记住,在绘制组件时,组件的Graphics
上下文已经被翻译,因此0x0
是组件的左上角。这意味着,根据您的代码,您最有可能以任何方式超出组件的可见边界。
所以,你基本上有两个选择。实现您自己的布局管理器,它使用Coordinate
信息将Icon
放入容器中(然后需要覆盖getPreferredSize
以提供大小提示)或者绘制你自己
这可能看起来像这样......
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("Graph Editor");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setResizable(true);
frame.add(new MyPanel());
frame.pack();
frame.setVisible(true);
}
});
}
public class Coordinate {
private int x;
private int y;
public Coordinate(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}
public class Icon {
private Coordinate coordinate;
public Icon(Coordinate coordinate) {
this.coordinate = coordinate;
}
public Coordinate getCoordinate() {
return coordinate;
}
public void paint(Graphics2D g2d) {
g2d.setColor(Color.RED);
g2d.fillRect(0, 0, 20, 20);
g2d.setColor(Color.BLACK);
g2d.drawRect(0, 0, 20, 20);
}
}
public class MyPanel extends JPanel {
private Set<Icon> points;
public MyPanel() {
points = new HashSet<>();
setLayout(null);
setPreferredSize(new Dimension(600, 600));
setBackground(Color.YELLOW);
}
//gets called by `FILE OPEN` listener for each coordinate
public void makeIcons(Coordinate obj) {
points.add(new Icon(obj));
repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (Icon icon : points) {
Graphics2D g2d = (Graphics2D) g.create();
Coordinate coordinate = icon.getCoordinate();
// I'd have a size component associated with the Icon
// which I'd then use to offset the context by half its
// value, so the icon is paint around the center of the point
g2d.translate(coordinate.getX() - 10, coordinate.getY() - 10);
icon.paint(g2d);
g2d.dispose();
}
}
}
}
我没有播种任何值,我很懒,但那是基本的想法