【发布时间】:2020-11-28 23:03:34
【问题描述】:
我的代码存在问题,即当我将 City 类实例化为对象并将其添加到 JSplitPane 的右侧(甚至左侧)时,应该绘制的圆圈是没有出现。我的城市类使用paintComponent 并且应该通过调用构造函数来绘制一个圆圈。我也尝试将重绘放在它自己的 drawIt() 方法中,但结果仍然相同。按钮和微调器显示在分隔线的左侧,但我尝试绘制的圆圈根本不显示。
这是我的 City 类。
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 的右侧(在 Add Components 下),这就是我遇到问题的地方,因为黑色圆圈不会在 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 下绘制的,就好像我将我的城市对象(测试)添加到我的框架中,而不是添加组件下的 JSplitPane(frame.add(test) 而不是 rp.add(test)部分)黑色圆圈将出现在所需的位置,但 JSplitPane 以及按钮和微调器将消失,所以我觉得它们好像是冲突的。是否有任何解决方法,或者是否有另一种方法可以使圆圈出现在右侧,而其他组件在左侧。 我不知道为什么它没有在 JSplitPane 上绘制圆圈,但任何形式的帮助都将不胜感激。谢谢! 抱歉,如果有任何不清楚的地方或我的代码有任何歧义,或者我需要发布更多信息,因为我是在这里发布的新手。让我知道是否还有其他需要添加的内容,或者对我所问的内容有任何疑问!
编辑: 我画圆圈的地方似乎有什么东西挡住了,比如另一个 JPanel。这是下面的图像。如您所见,圆圈的一部分看起来好像被覆盖了。我画的小盒子是唯一可以看到圆点的区域(在其他任何地方,圆圈都被白色覆盖)。另外,下图中圆圈的坐标在 (3, 0),即 City test = new City(3, 0); 我不太确定为什么会这样。 the invisible JPanel?
【问题讨论】:
-
再一次,空布局把你搞砸了。正在添加您的 City JPanel,但默认大小为 0,0 - 如果它这么小,怎么能显示?您需要 1) 摆脱空布局,2) 以智能方式覆盖 City 的 `getPreferredSize。 3) 以智能的方式学习和使用布局。
-
另外,在 City 类的 paintComponent 方法中,drawOval 方法 X 和 Y 与 JPanel 相关,而不是 JSplitPane。为您的 X 和 Y 尝试零。
-
@GilbertLeBlanc 感谢您提供的信息。我按照您所说的进行了尝试,现在黑点位于 JSplitPane 右侧的顶部中心(当我尝试将 0,0 作为 X 和 Y 时)。但似乎在绘制圆圈的上方还有另一个面板。当我将 X 和 Y 1 像素向下移动到一侧时,圆圈的一半(或一部分)似乎被一个空白的 JPanel 覆盖?
-
我不知道你的 GUI 应该是什么样子。我需要一张图片或一些 ASCII 艺术作品,以便我可以正确发表评论。
-
抱歉@GilbertLeBlanc,正在添加图片!
标签: java swing jpanel layout-manager null-layout-manager