java jsplitpane和paintcomponent相互冲突
我的代码有问题,因为当我将City类实例化为一个对象并将其添加到JSplitPane的右侧(甚至左侧)时,应该绘制的圆圈没有出现。我的cities类使用paintComponent,只需调用构造函数就可以画出一个圆。我也尝试过将重新绘制放在自己的drawIt()方法中,但结果仍然是一样的。按钮和微调器显示在分隔器的左侧,但我试图绘制的圆圈根本不显示
这是我的城市班
import javax.swing.*;
import java.awt.*;
public class City extends JPanel{
int xPos, yPos;
City(int x, int y){
xPos = x;
yPos = y;
repaint();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.BLACK);
g.fillOval(xPos, yPos, 10, 10);
}
}
这是我的主要观点。 在这里,我尝试实例化我的城市,并将其添加到JSplitPane的右侧(在“添加组件”下),这就是我遇到问题的地方,因为黑色圆圈不会在JSplitPane上绘制
import java.awt.*;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JSplitPane;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingUtilities;
public class TSP{
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TSP();
}
});
}
TSP(){
JLabel instructions = new JLabel("Enter the number of cities: ");
instructions.setBounds(30, 150, 300, 40);
SpinnerNumberModel numMod = new SpinnerNumberModel(2, 2, 10, 1);
JSpinner numOfCities = new JSpinner(numMod);
numOfCities.setBounds(185, 150, 80, 40);
JButton start = new JButton("Start Simulation");
start.setBounds(50, 400, 200, 40);
JFrame frame = new JFrame("Travelling Salesperson");
JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
JPanel lp = new JPanel(null);
JPanel rp = new JPanel(null);
sp.setDividerLocation(300);
sp.setLeftComponent(lp);
sp.setRightComponent(rp);
sp.setEnabled(false);
frame.setDefaultCloseOperation(3);
frame.setSize(1100,600);
frame.setResizable(false);
////////////////Add Components//////////////////////////
lp.add(instructions);
lp.add(numOfCities);
lp.add(start);
City test = new City(301, 301);
rp.add(test);
frame.add(sp);
////////////////////////////////////////////////////////
frame.setVisible(true);
}
}
我觉得这个圆圈是在JSplitPane下画的,就像我把我的城市对象(test)添加到我的框架中,而不是JSplitPane(frame.add(test)而不是在add Components部分下的rp.add(test))黑色圆圈将出现在所需的位置,但是JSplitPane以及按钮和微调器将消失,所以我觉得它们相互矛盾。有没有办法解决这个问题,或者有没有其他方法可以使圆圈显示在右侧,而其他组件显示在左侧。 我不知道为什么它不在JSplitPane上画圆圈,但任何形式的帮助都将不胜感激。谢谢 抱歉,如果我的代码中有任何不清楚或不明确的地方,或者我需要发布更多信息,因为我是新来这里发布的。如果还有什么需要补充的,或者关于我的问题,请告诉我
编辑: 好像有什么东西挡住了我画圆圈的地方,就像另一个JPanel。下面是一张图片。正如你所看到的,圆圈的一部分看起来好像被覆盖了。我画的小盒子是唯一一个可以看到圆点的区域(其他地方的圆圈都被白色覆盖)。此外,下图中圆圈的坐标为(3,0),即城市测试=新城(3,0); 但我不太清楚为什么会发生这种情况。 the invisible JPanel?
# 1 楼答案
既然我已经了解了你的意图,我可以提供一个更恰当的答案
左边是控制面板,右边是绘图面板。通常,您不会使用JSplitPane来分隔面板。要创建布局,可以将控制面板添加到}的行_开头,并将绘图面板添加到中间
JFrame
{原因是您不想不断地重新计算图形面板的大小
所以,让我告诉你一种方法,让你有一个坚实的开始。这是我创建的GUI
以下是我做的事情
所有Swing GUI应用程序都必须以调用
SwingUtilities
invokeLater
方法开始。此方法确保在Event Dispatch Thread上创建和执行Swing组件我分离了
JFrame
、控制面板和绘图面板的创建。这样,我可以一次只关注GUI的一部分必须按特定顺序调用
JFrame
方法。这是我在大多数Swing应用程序中使用的顺序JFrame
的大小未调整。它很拥挤。{a3}将计算组件和{我使用了
FlowLayout
和GridBagLayout
来创建控制面板。是的,这看起来比绝对定位更复杂,但从长远来看,布局管理器允许GUI更灵活我在绘图面板中使用了
setPreferredSize
方法来设置绘图面板的首选大小。因为我知道绘图面板的大小,所以我可以将第一个城市放在绘图面板的中心这是代码。你不必像这样编写代码,但这段代码应该为你开始项目打下良好的基础。看看model / view / controller pattern,看看如何进一步将代码分成更小的部分,让您一次只关注应用程序的一部分
我把所有的类都放在一个文件中,以便于粘贴。你应该把这些类分成不同的文件