我是java swing编程的新手。我想做的是在一个JPanel中的特定位置上画一个字符串,这个JPanel非常大,所以我把它添加到一个JScrollpane中,但是当我画这个字符串的时候,它不仅在指定的位置上,而且在其他的位置上。这个JPanel非常大,所以我把它添加到一个JScrollpane中,但是当我绘制字符串时,它不仅被打印在指定的位置,而且还被打印在其他位置。 第一张图代表了我决定绘制字符串的面板底部,这是正确的。但是,如果你观察整个面板,你可以发现字符串也在其他位置(见第二张图)。 谁能告诉我为什么会发生这种情况?如何防止这种情况的发生?
import java.util.*;
import java.io.*;
import javax.swing.*;
import java.awt.*;
class Example extends JFrame
{
private MyPanel gg=new MyPanel();
Example(){
add(new JScrollPane(gg));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setExtendedState(MAXIMIZED_BOTH);
}
public static void main(String argv[]){
EventQueue.invokeLater(new Runnable() {
public void run() {
Example test=new Example();
test.setVisible(true);
}
});
return;
}
}
class MyPanel extends JPanel
{
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d=(Graphics2D)g;
g2d.drawString("HI I LOVE ELON MUSK", 90, 300035);
return;
}
public Dimension getPreferredSize() {
return new Dimension(500, 300060);
}
}
你的代码在我的Windows 10系统上运行得很好。 我有一个Java 13 JDK,我以Java 8编译。
我对你的主类做了一些修改。 也许这些变化稳定了显示。 在你的系统上运行我的代码,看看。
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class LongJPanelExample {
public LongJPanelExample() {
JFrame frame = new JFrame("Long JPanel Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MyPanel gg = new MyPanel();
frame.add(new JScrollPane(gg));
frame.pack();
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setVisible(true);
}
public static void main(String argv[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
new LongJPanelExample();
}
});
}
}
class MyPanel extends JPanel {
private static final long serialVersionUID = 1L;
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawString("HI I LOVE ELON MUSK", 90, 300035);
return;
}
public Dimension getPreferredSize() {
return new Dimension(500, 300060);
}
}