我正在研究一个使用Java Swing的小例子,我想在一个面板上绘制一个正弦图,在另一个面板上绘制图形的坐标。所以我创建了一个扩展JFrame
的类,然后我为图形和坐标创建了JPanel
。为了显示坐标,我正在使用JList
。现在问题是坐标显示重复值。这是我的代码:
public class MyFrame extends JFrame {
JList list;
DecimalFormat df = new DecimalFormat("#.###");
DefaultListModel model = new DefaultListModel();
private JPanel contentPane;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MyFrame frame = new MyFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public MyFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 600, 600);
contentPane = new JPanel();
contentPane.setBorder(new LineBorder(new Color(0, 0, 0)));
setContentPane(contentPane);
contentPane.setLayout(new GridLayout(1, 2, 0, 0));
JPanel panel = new MyGraph();
panel.setBorder(new LineBorder(new Color(0, 0, 0)));
contentPane.add(panel);
list = new JList(model);
list.setVisibleRowCount(4);
JPanel panel_1 = new JPanel();
panel_1.setBorder(new LineBorder(new Color(0, 0, 0)));
panel_1.setLayout(new BoxLayout(panel_1, BoxLayout.Y_AXIS));
JLabel lblNewLabel_1 = new JLabel("X - Y");
panel_1.add(lblNewLabel_1);
JScrollPane slistScroller = new JScrollPane(list);
panel_1.add(slistScroller);
contentPane.add(panel_1);
}
class MyGraph extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
int xBase = 10;
int top = 100;
int yScale = 10;
int xAxis = 360;
int yBase = top + yScale;
g.drawLine(xBase, top, xBase, top + 2 * yScale);
g.drawLine(xBase, yBase, xBase + xAxis, yBase);
g.setColor(Color.red);
int x2=0, y2=0;
int x1 = xBase + 0;
int y1 = yBase - (int) (10*Math.sin(0) * yScale);
int i;
for (i = 0; i < 10; i++) {
x2 = xBase + i;
y2 = yBase - (int) (10*Math.sin(i) * yScale);
g.drawLine(x1, y1, x2, y2);
x1 = x2;
y1 = y2;
df = new DecimalFormat("#.###");
model.addElement(i +" -- " + df.format(10*Math.sin(i)));
}
model.addElement("------END----------");
}
}
}
这是我的程序的输出:
根据我的计划,我从角度for loop
获得了0 to 10
,我将DefaultListModel model
的值添加到JList list
。
在此代码中,有人可以帮我解决我的错误吗?
即使我有这一行list.setVisibleRowCount(4);
,我也希望用滚动条向用户显示只有4条记录,但根据输出图像,它不会像那样工作。
答案 0 :(得分:2)
paintComponent
可能是任意次,出于各种原因,请尝试调整框架大小并查看会发生什么。
你的绘画方法应该专注于这样做,绘画。
您需要更改流程,以便paintComponent
变得依赖于模型,而不是相反。
请查看Painting in AWT and Swing,了解有关在Swing中绘画的更多详细信息。
您可能还需要考虑使用ListCellRender
在JList
中呈现模型中的数据,这样您就可以更轻松地共享模型及其数据。< / p>
有关详细信息,请参阅Writing a Custom Cell Renderer