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)组件混合使用?