JScrollPane添加到JFrame中,怎么不显示呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JScrollPane添加到JFrame中,怎么不显示呢?相关的知识,希望对你有一定的参考价值。

咋回事,JScrollPane添加到JFrame窗体中,运行后窗体不显示滚动条啊,输入超过窗体范围也不显示,求解?
回答具体代码也可以。

给个示例:
将文本框嵌入到滚动窗格中:
JFrame frame= new JFrame();
JPanel panel = (JPanel)frame.getContentPane();
panel.setLayout(new BorderLayout());
JTextArea textArea = new JTextArea();
//创建滚动窗格,并且指定其作为textArea的视图窗口
JScrollPane jspane = new JScrollPane(textArea);
//或者这样做也可以:
/**
JScrollPane jspane = new JScrollPane();
jspane.setViewPortView(textArea);
**/
panel.add(jspane,BorderLayout.Center);
frame.setSize(400, 400);
frame.setVisible(true);
参考技术A 貌似你添加翻了。。你试试把JFrame添加到JScrollPane中。。。再把JScrollPane添加到你的容器或者是框架(JPanel)中。。。

爪哇。无法在 JScrollPane 中添加 JPanel

【中文标题】爪哇。无法在 JScrollPane 中添加 JPanel【英文标题】:Java. Cant add JPanel in JScrolledPane 【发布时间】:2013-05-22 19:44:03 【问题描述】:

我将JTabbedPane 添加到JFrame

每个选项卡包含不同的bgPanelJPanel 以绘制的图像为背景),每个bgPanel 包含JScrollPane,每个JScrollPane 包含一个JPanenowyPanel)。

bgPanels 只是一个背景。每个JScrollPane 都有setOpaque(false);getViewport().setOpaque(false);。每个JPanel nowyPanel 都只有setOpaque(false);

我可以看到背景和JScrollPanels,但看不到JPanels。我检查了一下,似乎内容已正确添加到那里。问题在于 JPanels 没有出现。

这里有一些代码:

static class JBackgroundPanel extends JPanel 

    private BufferedImage img;

    JBackgroundPanel() 
        try 
            img = ImageIO.read(new File("2.jpg"));
         catch (IOException e) 
        
    

    @Override
    protected void paintComponent(Graphics g) 
        super.paintComponent(g);
        g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
    


//method to add components to element of array nowyPanel[] JPanel
//i[a] and o are set earlier and they are fine
static void skrotyDoPaneli() 
    int a, b;
    for (a = 0; a < o; a++) 
        for (b = 0; b < i[a]; b++) 
            nowyPanel[a].add(new dodanieIkony(ikonki[a][b], podpisyIkonek[a][b], listaOdnosnikow[a][b]));
            nowyPanel[a].repaint();
            nowyPanel[a].revalidate();
        
    


//set properties for all panels 
static void ladowaniePaneli() 
    int b;
    Dimension osiemsetnaszescset = new Dimension(800, 600);
    for (b = 0; b < o; b++) 
        bgPanel[b] = new JBackgroundPanel();
        vertical[b] = new JScrollPane();
        nowyPanel[b] = new JPanel();

        ((FlowLayout) bgPanel[b].getLayout()).setVgap(0);
        bgPanel[b].setPreferredSize(osiemsetnaszescset);
        nowyPanel[b].setPreferredSize(osiemsetnaszescset);
        vertical[b].setPreferredSize(new Dimension(789, 517));
        vertical[b].setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

        vertical[b].setOpaque(false);
        nowyPanel[b].setOpaque(false);
        vertical[b].getViewport().setOpaque(false);
        vertical[b].add(nowyPanel[b]);
        bgPanel[b].add(vertical[b]);
        vertical[b].add(nowyPanel[b]);
    

//each element of bgPanel array is set as individual tab
static JTabbedPane tabbedPane() 
    JTabbedPane panelZakladek = new JTabbedPane();
    int j;
    for (j = 0; j < o; j++) 
        panelZakladek.addTab(nazwyGrup[j], bgPanel[j]);
    
    return panelZakladek;


//does everything what needs to be done before JFrame shows up
static void przedStartem() throws FileNotFoundException, IOException 
    odczyt();
    odczytPaneli();
    ladowaniePaneli();
    skrotyDoPaneli();


//does przedStartem() and then initialize JFrame with content
public static void main(String[] args) throws FileNotFoundException, IOException 
    przedStartem();
    //przywolanie do zycia okna glownego JFrame
    EventQueue.invokeLater(new Runnable() 
        @Override
        public void run() 
            glowneOkno okno = new glowneOkno();
            okno.setVisible(true);
        
    );

//Variables Declaration
static int o = 0;
static int[] i = new int[1000];
static JBackgroundPanel[] bgPanel = new JBackgroundPanel[1000];
static JScrollPane[] vertical = new JScrollPane[1000];
static JPanel[] nowyPanel = new JPanel[1000];
static FileSystemView fsv = FileSystemView.getFileSystemView();
static String[] nazwyGrup = new String[1000];
static File plikZGrupami = new File("grupy.txt");
static String[][] podpisyIkonek = new String[1000][1000];
static Icon[][] ikonki = new Icon[1000][1000];
static String[][] listaOdnosnikow = new String[1000][1000];
static File[][] listaPlikow = new File[1000][1000];

【问题讨论】:

当所有的变量、方法和类都是静态的时,你就知道你的设计很糟糕。我建议您查看 Swing 教程,了解如何更好地构建程序的示例。 【参考方案1】:
bgPanel[b].add(vertical[b]);
vertical[b].add(nowyPanel[b]);

不要将组件添加到滚动窗格。相反,代码应该是:

vertical[b].setViewportView(nowyPanel[b]);

【讨论】:

谢谢帮助。几秒钟前我自己才注意到它。不知道为什么我这样做,但现在一切正常。您的代码工作正常,但因为我更习惯它,所以我这样做了:vertical[b] = new JScrollPane(nowyPanel[b]); 我通常也是这样创建滚动窗格的。【参考方案2】:

首先让我感到震惊的是你没有更改JPanel 的默认布局管理器,即FlowLayout...尝试将JBackgroundPanel 的布局管理器更改为@改为 987654325@。

您应该避免使用setPreferredSize。问题是它可以被程序的其他部分改变。相反,您应该重写 getPreferredSize 方法,这实际上应该在 JBackgroundPanel 类中完成。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestBackgroundPane 

    public static void main(String[] args) 
        new TestBackgroundPane();
    

    public TestBackgroundPane() 
        EventQueue.invokeLater(new Runnable() 
            @Override
            public void run() 
                try 
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                 catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) 
                

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            
        );
    

    public class TestPane extends JPanel 

        public TestPane() 
            setLayout(new BorderLayout());
            JPanel top = new JPanel(new GridBagLayout());
            top.setOpaque(false);
            top.add(new JLabel("Look ma, no hands"));
            JScrollPane sp = new JScrollPane();
            sp.setOpaque(false);
            sp.getViewport().setOpaque(false);
            sp.setViewportView(top);
            add(sp);
        

        @Override
        public Dimension getPreferredSize() 
            return new Dimension(200, 200);
        

        @Override
        protected void paintComponent(Graphics g) 
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setColor(Color.RED);
            g2d.drawLine(0, 0, getWidth(), getHeight());
            g2d.drawLine(getWidth(), 0, 0, getHeight());
            g2d.dispose();
        
    

【讨论】:

以上是关于JScrollPane添加到JFrame中,怎么不显示呢?的主要内容,如果未能解决你的问题,请参考以下文章

如何强制刷新/重绘 JScrollPane?

爪哇。无法在 JScrollPane 中添加 JPanel

大于 JFrame 的可拖动组件(JScrollPane,每侧都有不可见的滚动条)

第十二周

JButton 出现在一台计算机上,但不出现在其他计算机上(BorderLayout)

Java Swing - 使用 JScrollPane 并让它滚动回顶部