Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaSwing为什么在JScrollpane中的面板中绘制大量字符串时它们会重叠?_Java_Swing_Paint - Fatal编程技术网

JavaSwing为什么在JScrollpane中的面板中绘制大量字符串时它们会重叠?

JavaSwing为什么在JScrollpane中的面板中绘制大量字符串时它们会重叠?,java,swing,paint,Java,Swing,Paint,我是java swing的新手 我想画很多里面有数字的矩形。因此,我将扩展JPanel的面板放在JScrollpane中 我注意到,如果我有几个矩形,效果会很好,但是如果我画了很多矩形,字符串就会相互重叠(见下图)。有人能帮我修一下吗 多谢各位 代码: import java.util.*; 导入java.io.*; 导入javax.swing.*; 导入java.awt.*; 类绘图扩展了JFrame { 私有myPanel gg=新建myPanel(); 图纸(){ setLayout(新


我是java swing的新手
我想画很多里面有数字的矩形。因此,我将扩展JPanel的面板放在JScrollpane中
我注意到,如果我有几个矩形,效果会很好,但是如果我画了很多矩形,字符串就会相互重叠(见下图)。有人能帮我修一下吗
多谢各位

代码:

import java.util.*;
导入java.io.*;
导入javax.swing.*;
导入java.awt.*;
类绘图扩展了JFrame
{
私有myPanel gg=新建myPanel();
图纸(){
setLayout(新的BorderLayout());
添加(新JLabel(“你好”),“北部”);
添加(新JScrollPane(gg),“中心”);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setExtendedState(最大化两个);
}
公共静态void main(字符串argv[]){
invokeLater(新的Runnable(){
公开募捐{
图纸prova=新图纸();
prova.setVisible(真);
}
});
返回;
}
}
类myPanel扩展了JPanel
{
私有void drawCenteredStringInRect(图形2D g2d、字符串文本、整数基、整数高、整数xRect、整数yRect){
FontMetrics fm=g2d.getFontMetrics();
int x=xRect+((基本fm.stringWidth(文本))/2);
int y=yRect+((height-fm.getHeight())/2)+fm.getAscent());
系统输出打印(x+“”+y+“\n”);
g2d.抽绳(文本,x,y);/(字符串,x,y)
返回;
}
公共组件(图形g){
超级组件(g);
Graphics2D g2d=(Graphics2D)g;
内底=80,高度=20,xRect=5,yRect=5;
String num=“2147483648”;
//x1 y1,x2 y2

对于(int i=0;i您可以使用
JLabel
为您绘制。您甚至不必为每个字符串创建单独的标签,而是创建一个标签并将其用作“画师”,即在标签上调用
#setBounds
,然后让它每次为您绘制字符串

类MyPanel扩展了JPanel{
私人最终JLabel stringPainter;
我的小组(){
stringPainter=新的JLabel();
stringPainter.set不透明(假);
stringPainter.setHorizontalTextPosition(JLabel.CENTER);
stringPainter.setVerticalTextPosition(JLabel.CENTER);
}
私有void drawCenteredStringInRect(图形g、字符串文本、矩形矩形矩形){
图形cg=g.创建();
stringPainter.setBounds(矩形);
stringPainter.setText(文本);
油漆工(cg);
cg.dispose();
}
@凌驾
公共组件(图形g){
超级组件(g);
int-hPad=5;
int-vPad=5;
矩形rect=新矩形(hPad,hPad,80,20);
String num=“2147483648”;

对于(int i=0;iA
JTable
将快速轻松地处理和显示5000万个数字(具有正确的渲染)。请注意,用作单元格渲染器的
JLabel
是用于绘制每个表单元格的单个组件

import java.awt.*;
导入javax.swing.*;
导入javax.swing.table.*;
导入javax.swing.border.*;
公共类500万个可识别{
私有JComponent ui=null;
5000万数字可输入(){
initUI();
}
公共最终无效初始值(){
如果(ui!=null)返回;
ui=新JPanel(新边界布局(4,4));
ui.新订单(新的空订单(4,4,4,4));
int maxNum=5000000;
int colNum=10;
整数[]cols={1,2,3,4,5,6,7,8,9,10};
整数[][]个数=新整数[maxNum/colNum][colNum];
对于(int ii=0;ii{
FiftyMillionNumbersInTable o=新的FiftyMillionNumbersInTable();
JFrame f=新的JFrame(o.getClass().getSimpleName());
f、 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f、 setLocationByPlatform(真);
f、 setContentPane(o.getUI());
f、 包装();
f、 setMinimumSize(f.getSize());
f、 setVisible(真);
};
SwingUtilities.invokeLater(r);
}
}

“我想画很多里面有数字的矩形”我会在一个
JLabel
中显示每个数字,添加一个
LineBorder
,然后将它们放在一个
JPanel
和一个
GridLayout
中。为什么不这样做呢?自定义绘制有什么原因吗?我害怕分配所有JLabel所需的内存量。代码应该以大数字运行。类名应该开始使用大写字符。如果绘制不正确,那么绘制逻辑是错误的。为什么不在调试时从合理数量的字符串开始绘制。“我害怕内存量”我建议的方法适用于50000个数字。不过,要想进入屏幕确实需要一些时间。如果这是一个问题,请考虑使用
JTable
来显示它们。此外,还要考虑:1)过早优化,以及2)@camickr我做到了,它可以工作,我有一个高值的问题。你自己试试,把for循环中的50000换成一个较小的数字,比如100或10。
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);
    }
}
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.border.*;

public class FiftyMillionNumbersInTable {

    private JComponent ui = null;

    FiftyMillionNumbersInTable() {
        initUI();
    }

    public final void initUI() {
        if (ui!=null) return;

        ui = new JPanel(new BorderLayout(4,4));
        ui.setBorder(new EmptyBorder(4,4,4,4));
        int maxNum = 5000000;
        int colNum = 10;
        Integer[] cols = {1,2,3,4,5,6,7,8,9,10};
        Integer[][] numbers = new Integer[maxNum/colNum][colNum];
        for (int ii=0; ii<maxNum; ii++) {
            numbers[ii/colNum][(ii%colNum)] = ii;
        }
        JTable table = new JTable(numbers, cols);
        table.setDefaultRenderer(Object.class, new CenterCellRenderer());
        ui.add(new JScrollPane(table));
    }

    class CenterCellRenderer extends DefaultTableCellRenderer {

        @Override
        public Component getTableCellRendererComponent(
                JTable table, Object value, 
                boolean isSelected, boolean hasFocus, 
                int row, int column) {
            Component c = super.getTableCellRendererComponent(table, value, 
                    isSelected, hasFocus, row, column);
            JLabel l = (JLabel)c;
            l.setHorizontalAlignment(SwingConstants.CENTER);
            return l;
        }
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = () -> {
            FiftyMillionNumbersInTable o = new FiftyMillionNumbersInTable();

            JFrame f = new JFrame(o.getClass().getSimpleName());
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setLocationByPlatform(true);

            f.setContentPane(o.getUI());
            f.pack();
            f.setMinimumSize(f.getSize());

            f.setVisible(true);
        };
        SwingUtilities.invokeLater(r);
    }
}