Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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
Java JScrollPane在swing中滚动后不显示内容_Java_Swing_Graphics2d - Fatal编程技术网

Java JScrollPane在swing中滚动后不显示内容

Java JScrollPane在swing中滚动后不显示内容,java,swing,graphics2d,Java,Swing,Graphics2d,您好,我需要在单个屏幕中显示大量数据内容(其图形数据),所以我尝试了以下代码 canvas.setPreferredSize(new Dimension(3000, 300)); canvas.setBackground(Color.blue); JScrollPane jsp = new JScrollPane(canvas); setPreferredSize(new Dimension(600, 500)); setLayout(new Grid

您好,我需要在单个屏幕中显示大量数据内容(其图形数据),所以我尝试了以下代码

    canvas.setPreferredSize(new Dimension(3000, 300));
    canvas.setBackground(Color.blue);

    JScrollPane jsp = new JScrollPane(canvas);

    setPreferredSize(new Dimension(600, 500));
    setLayout(new GridLayout(1, 0, 5, 0));

    jsp.getHorizontalScrollBar().addAdjustmentListener(new AdjustmentListener() {
        @Override
        public void adjustmentValueChanged(AdjustmentEvent e) {
            System.out.println(e.getValue());
            repaint();
        }
    });

    add(jsp);
这是我的MyCanvas课程

class MyCanvas extends Canvas {

@Override
public void paint(Graphics g) {
    super.paint(g);
    System.out.println("paint");
    g.setColor(Color.YELLOW);

    for (int i = 0; i < 100; i++) {
        g.drawString(""+i, i*30, 100);
    //  g.drawLine(10, 10, 20, 20);
    }

}
}
类MyCanvas扩展了Canvas{
@凌驾
公共空间涂料(图g){
超级油漆(g);
系统输出打印(“油漆”);
g、 setColor(颜色为黄色);
对于(int i=0;i<100;i++){
g、 抽绳(“+i,i*30100);
//g.抽绳(10,10,20,20);
}
}
}
但问题是,当我滚动窗口时,我看不到完整的内容,因为我预期它应该打印100个数字,但实际上并没有打印,有人能纠正我吗

在这里看到结果了吗


我建议您避免将AWT和Swing组件混合在一起(或者如果您绝对必须这样做,那么您必须确保了解陷阱并完全跳过所有必要的环

我自己,我会扩展JPanel,我确信它的首选大小是我想要的,因为这将决定它在JScrollPane中的大小

例如:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.*;

@SuppressWarnings("serial")
public class MyScrollExample extends JPanel {
    private static final int MAX = 100;
    private MyPanel myPanel = new MyPanel(MAX);

    public MyScrollExample() {
        JScrollPane scrollPane = new JScrollPane(myPanel);
        scrollPane.getViewport().setPreferredSize(new Dimension(600, 200));
        add(scrollPane);
    }

    private static void createAndShowGui() {
        MyScrollExample mainPanel = new MyScrollExample();

        JFrame frame = new JFrame("MyScrollExample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

@SuppressWarnings("serial")
class MyPanel extends JPanel {
    private static final Color BG = Color.BLUE;
    private static final Color FG = Color.YELLOW;
    private static final int WIDTH_GAP = 30;
    private static final int HEIGHT_GAP = 100;
    private int max;

    public MyPanel(int max) {
        setBackground(BG);
        this.max = max;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(FG);

        for (int i = 0; i < max; i++) {
            g.drawString("" + i, i * WIDTH_GAP, HEIGHT_GAP);
        }
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        int w = (WIDTH_GAP + 1) * max; 
        int h = HEIGHT_GAP * 3;
        return new Dimension(w, h);
    }

}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入javax.swing.*;
@抑制警告(“串行”)
公共类MyScrollExample扩展了JPanel{
专用静态最终整数最大值=100;
私有MyPanel MyPanel=新MyPanel(最大值);
公共myScrolleExample(){
JScrollPane scrollPane=新的JScrollPane(myPanel);
scrollPane.getViewport().setPreferredSize(新维度(600200));
添加(滚动窗格);
}
私有静态void createAndShowGui(){
MyScrollExample主面板=新建MyScrollExample();
JFrame=newJFrame(“myScrolleExample”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(主面板);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
调用器(()->createAndShowGui());
}
}
@抑制警告(“串行”)
类MyPanel扩展了JPanel{
专用静态最终颜色BG=Color.BLUE;
专用静态最终颜色FG=Color.YELLOW;
专用静态最终整数宽度_间隙=30;
专用静态最终内部高度_间隙=100;
私人int max;
公共MyPanel(int max){
退避地(BG);
this.max=max;
}
@凌驾
受保护组件(图形g){
超级组件(g);
g、 setColor(FG);
对于(int i=0;i
我建议您避免将AWT和Swing组件混合在一起(或者如果您绝对必须这样做,那么您必须确保了解陷阱并完全跳过所有必要的环

我自己,我会扩展JPanel,我确信它的首选大小是我想要的,因为这将决定它在JScrollPane中的大小

例如:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.*;

@SuppressWarnings("serial")
public class MyScrollExample extends JPanel {
    private static final int MAX = 100;
    private MyPanel myPanel = new MyPanel(MAX);

    public MyScrollExample() {
        JScrollPane scrollPane = new JScrollPane(myPanel);
        scrollPane.getViewport().setPreferredSize(new Dimension(600, 200));
        add(scrollPane);
    }

    private static void createAndShowGui() {
        MyScrollExample mainPanel = new MyScrollExample();

        JFrame frame = new JFrame("MyScrollExample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

@SuppressWarnings("serial")
class MyPanel extends JPanel {
    private static final Color BG = Color.BLUE;
    private static final Color FG = Color.YELLOW;
    private static final int WIDTH_GAP = 30;
    private static final int HEIGHT_GAP = 100;
    private int max;

    public MyPanel(int max) {
        setBackground(BG);
        this.max = max;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(FG);

        for (int i = 0; i < max; i++) {
            g.drawString("" + i, i * WIDTH_GAP, HEIGHT_GAP);
        }
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        int w = (WIDTH_GAP + 1) * max; 
        int h = HEIGHT_GAP * 3;
        return new Dimension(w, h);
    }

}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入javax.swing.*;
@抑制警告(“串行”)
公共类MyScrollExample扩展了JPanel{
专用静态最终整数最大值=100;
私有MyPanel MyPanel=新MyPanel(最大值);
公共myScrolleExample(){
JScrollPane scrollPane=新的JScrollPane(myPanel);
scrollPane.getViewport().setPreferredSize(新维度(600200));
添加(滚动窗格);
}
私有静态void createAndShowGui(){
MyScrollExample主面板=新建MyScrollExample();
JFrame=newJFrame(“myScrolleExample”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(主面板);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
调用器(()->createAndShowGui());
}
}
@抑制警告(“串行”)
类MyPanel扩展了JPanel{
专用静态最终颜色BG=Color.BLUE;
专用静态最终颜色FG=Color.YELLOW;
专用静态最终整数宽度_间隙=30;
专用静态最终内部高度_间隙=100;
私人int max;
公共MyPanel(int max){
退避地(BG);
this.max=max;
}
@凌驾
受保护组件(图形g){
超级组件(g);
g、 setColor(FG);
对于(int i=0;i
您尝试过布局管理器吗?一如既往,请在问题中发表一篇得体的文章。另外,您为什么要将Swing(JScrollPane)与AWT(Canvas)组件混合使用?您尝试过布局管理器吗?一如既往,请在问题中发表得体的文章。另外,您为什么要将Swing(JScrollPane)与AWT(Canvas)组件混合使用?