【发布时间】:2020-04-29 03:16:41
【问题描述】:
我是java swing的新手。
我想画很多里面有数字的矩形。因此,我将扩展 JPanel 的面板放在 JScrollpane 中。
我注意到,如果我有几个矩形,它工作得很好,但如果我画了很多矩形,字符串会相互重叠(见图)。有人可以帮我解决它吗?
谢谢你。
import java.util.*;
import java.io.*;
import javax.swing.*;
import java.awt.*;
class drawing extends JFrame
{
private myPanel gg=new myPanel();
drawing(){
setLayout(new BorderLayout());
add(new JLabel("HELLO"), "North");
add(new JScrollPane(gg), "Center");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setExtendedState(MAXIMIZED_BOTH);
}
public static void main(String argv[]){
EventQueue.invokeLater(new Runnable() {
public void run() {
drawing prova=new drawing();
prova.setVisible(true);
}
});
return;
}
}
class myPanel extends JPanel
{
private void drawCenteredStringInRect(Graphics2D g2d, String text, int base, int height, int xRect, int yRect){
FontMetrics fm = g2d.getFontMetrics();
int x=xRect+((base-fm.stringWidth(text))/2);
int y=yRect+(((height-fm.getHeight())/2)+ fm.getAscent());
System.out.print(x+" "+y+"\n");
g2d.drawString(text, x, y); //(string, x, y)
return;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d=(Graphics2D)g;
int base=80, height=20, xRect=5, yRect=5;
String num="2147483648";
//x1 y1, x2 y2
for(int i=0;i<=50000;++i){
if(i%10==0){
xRect=5;
yRect+=height+10;
}
xRect+=base+5;
g2d.drawRect(xRect, yRect, base, height); //(x, y, base, height)
drawCenteredStringInRect(g2d, Integer.toString(i), base, height, xRect, yRect);
}
return;
}
public Dimension getPreferredSize() {
return new Dimension(500, 10000000);
}
}
【问题讨论】:
-
“我想画很多里面有数字的矩形”我会在
JLabel中显示每个数字,添加一个LineBorder,然后将它们放在JPanel和GridLayout中。为什么不这样做?自定义绘画有什么原因吗? -
我害怕分配所有 JLabel 所需的内存量。代码应该以大数字运行。
-
类名应该以大写字符开头。如果事情没有正确绘制,那么你的绘制逻辑是错误的。为什么不从合理数量的字符串开始进行调试。
-
“我害怕内存量” 我建议的方法适用于 just fine 处理 50000 个数字。不过,它确实需要一些时间才能进入屏幕。如果这是一个问题,请使用
JTable来显示它们。还要研究:1)过早的优化,2)What is the XY problem? -
@camickr 我做了并且它有效,我有高价值的问题。自行尝试,将 for 循环中的 50000 更改为较小的数字,例如 100 或 10。