我正在学习Java。尝试创建一个包含线条的框架。它看起来很基本,但我看不出这条线。代码编译,我似乎无法理解为什么我看不到这条线。我在框架中看到了其他组件。 我正在使用2个java文件。一个文件是容器文件,另一个文件是绘制线代码。它们是包a1的一部分。 这是我的代码(请帮助):
容器文件:
package a1;
import javax.swing.*;
import java.awt.*;
public class gameContainer {
public static void addComponentsToPane(Container pane) {
pane.setLayout(null);
//add button to the pane
JButton b3 = new JButton("B1");
pane.add(b3);
//add line to the pane
drawingLine line1 = new drawingLine();
pane.add(line1);
//size and position all relatively
Insets insets = pane.getInsets();
Dimension size;
size = b3.getPreferredSize();
b3.setBounds(350+insets.left,15+insets.top,size.width+50,size.height+20);
size = line1.getPreferredSize();
line1.setBounds(350+insets.left,75+insets.top,size.width+50,size.height+20);
}
private static void createAndShowGUI() {
int l = 200, w = 80;
//Create and set up the window.
JFrame frame = new JFrame("Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Set up content pane
addComponentsToPane(frame.getContentPane());
//add menu bar
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("Menu");
menu.add(new JMenuItem("Do nothing"));
menuBar.add(menu);
frame.setJMenuBar(menuBar);
// size and display root pane/window
Insets insets = frame.getInsets();
frame.setSize(500+insets.left+insets.right,300+insets.top+insets.bottom);
frame.setLocation(w,l);
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
绘制行文件:
package a1;
import javax.swing.*;
import java.awt.geom.Line2D;
import java.awt.Graphics2D;
import java.awt.Graphics;
public class drawingLine extends JPanel{
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
Line2D line = new Line2D.Double(200, 300, 1000, 1000);
//g2d.setColor(Color.black);
g2d.draw(line);
//g.drawLine(200, 300, 1000, 1000);
//g.setColor(color.BLACK);
}
}
为什么我看不到这条线?
答案 0 :(得分:7)
您的主要问题是您使用null
/ Absolute
布局。
你应该在这里阅读:
1)您应该使用适当的LayoutManager
(或嵌套多个LayoutManager
s)和/或覆盖getPreferredSize()
的{{1}}来返回符合图纸的正确尺寸
2)请勿在{{1}}上致电JComponent
,而是在设置setSize
可见之前致电JFrame
(以上记得)
3)由于pack()
JFrame
和getContentPane().add(..)
已转发至contentPane,因此无需通过add(..)
添加 contentPane 。
4)观察类名,坚持java约定,类名以大写字母开头,之后每个新单词应首字母化,即setLayout(..)
应为remove(..)
,{{1应该是gameContainer
以下是您的代码实现了上述修复程序(不是最好的布局,但它只是一个示例):
GameContainer
答案 1 :(得分:2)
大卫·克鲁坎普已经证明了正确的(更好的说,更容易,更不容易出错)的方式。至于您的原始问题,请修改原始代码,如下所示:
line1.setBounds(350+insets.left,75+insets.top,size.width+50,size.height+20);
line1.setBorder(BorderFactory.createEtchedBorder()); // add this line
您的线条从200,300点开始,但您正在绘制的面板宽度为50 + 10,高度为20 + 10 - 至少在我的计算机上 - 这意味着该线条在{{1}之外面板,这就是为什么它不被绘制。要验证是否修改原始drawingLine
中的行,请执行以下操作:
drawingLine.paintComponent
您将看到以下结果:
原始代码中的这一行:
Line2D line = new Line2D.Double(0, 0, 1000, 1000);
非常清楚 - 您没有使用布局管理器,换句话说您选择使用absolute positioning。这意味着组件的坐标,宽度和高度必须由您预先计算和设置。但如果你在某个地方犯了错误(正如你的例子很好地展示的那样),那将很难被发现。更不用说,例如,如果你想处理窗口大小调整。这就是LayoutManagers存在的原因。
我也建议阅读: