草庐IT

Java JScrollpane 不可见

coder 2024-03-12 原文

我试图在 JScrollpane 中显示一系列按钮。阅读周围,我设法退出此代码,但没有显示任何内容。我不明白可能的错误。谢谢你的帮助

按照建议我做了一些更改,我编辑了但不起作用

已编辑 或者我很笨,或者这是其他问题。这是我带有输出图像的完整代码

public class Main extends javax.swing.JFrame {
    private final JPanel gridPanel;

    public Main() {
        initComponents();
        // EXISTING PANEL
        gridPanel = new JPanel();
        JScrollPane scrollPane = new JScrollPane(gridPanel);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        JPanel borderLayoutPanel = new JPanel(new BorderLayout());
        borderLayoutPanel.add(scrollPane, BorderLayout.CENTER);

        this.Avvio();
    }

    private void Avvio() {
        JPanel pane = new JPanel(new GridBagLayout());
        pane.setBorder(BorderFactory.createLineBorder(Color.BLUE));
        pane.setLayout(new GridBagLayout());

        for (int i = 0; i < 10; i++) {
            JButton button;
            GridBagConstraints c = new GridBagConstraints();
            c.fill = GridBagConstraints.HORIZONTAL;
            c.anchor = GridBagConstraints.PAGE_START;

            button = new JButton("Button 1");
            c.weightx = 0.5;
            c.gridx = 0;
            c.gridy = i;
            pane.add(button, c);

            button = new JButton("Button 2");
            c.gridx = 1;
            c.gridy = i;
            pane.add(button, c);

            button = new JButton("Button 3");
            c.gridx = 2;
            c.gridy = i;
            pane.add(button, c);

        }
        gridPanel.add(pane);
        gridPanel.revalidate();
        gridPanel.repaint();

    }
}

最佳答案

好的,从你在另一个答案中的评论:

No problem for compile , simply the Jpanel is empty. The buttons does not appear.

调用 this.Avvio(); 后,您必须调用:

this.add(scrollPane);
this.pack();

这将产生以下输出(在调整大小之前和之后):

但是还是没有JScrollPanel

这至少解决了第一个问题,但是您的代码中有更多错误,其中一些错误已经在其他答案中进行了注释:

  1. 您正在扩展 JFrame,这不是必需的,因为您可以创建一个 JFrame 实例/对象并在以后使用它。您永远不会更改 JFrame 的行为,这就是不需要扩展它的原因。参见 Extends JFrame vs. creating it inside the program有关这方面的更多信息。

  2. 您没有调用 pack()setSize(...) 这会创建一个小窗口,您需要手动调整它的大小。在使您的 JFrame 可见之前调用推荐的 pack()。 (正如本答案开头所建议的那样)。

  3. 您正在调用 .invokeLater() 方法两次。你只需要调用一次,我更喜欢这种方式:

     SwingUtilities.invokeLater(() -> new Main()); //Note there is no call to .setVisible(true); as per point #1. It should go later in the program like:  frame.setVisible(true);
    
  4. 您正在调用 gridPanel.revalidate();gridPanel.repaint() 虽然它不会影响您的程序,但您不需要它GUI 仍然不可见,因此这些调用对您的程序没有影响,您可以安全地删除它们。

  5. 您在 for 循环的每次迭代中创建了一个新的 GridBagConstraints 对象,您只需在其中更改其属性并在 外部声明它code>for 循环,这将使您的程序变得更好。

遵循上述建议后,您可以得到如下代码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class Main {
    private final JPanel gridPanel;
    private JFrame frame;

    public Main() {
        // EXISTING PANEL
        gridPanel = new JPanel();
        JScrollPane scrollPane = new JScrollPane(gridPanel);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        JPanel borderLayoutPanel = new JPanel(new BorderLayout());
        borderLayoutPanel.add(scrollPane, BorderLayout.CENTER);

        this.Avvio();
        
        frame.add(scrollPane);
        frame.pack();
        frame.setVisible(true);
    }

    private void Avvio() {
        JPanel pane = new JPanel(new GridBagLayout());
        pane.setBorder(BorderFactory.createLineBorder(Color.BLUE));
        pane.setLayout(new GridBagLayout());

        for (int i = 0; i < 10; i++) {
            JButton button;
            GridBagConstraints c = new GridBagConstraints();
            c.fill = GridBagConstraints.HORIZONTAL;
            c.anchor = GridBagConstraints.PAGE_START;

            button = new JButton("Button 1");
            c.weightx = 0.5;
            c.gridx = 0;
            c.gridy = i;
            pane.add(button, c);

            button = new JButton("Button 2");
            c.gridx = 1;
            c.gridy = i;
            pane.add(button, c);

            button = new JButton("Button 3");
            c.gridx = 2;
            c.gridy = i;
            pane.add(button, c);

        }
        gridPanel.add(pane);
    }

    public static void main(String args[]) {
        /* Create and display the form */
        SwingUtilities.invokeLater(() -> {
            new Main();
        });
    }
}

仍然产生这个输出:

但是......我们还可以再改进一点!

我们可能有两个嵌套的 for 循环,用于 GridBagConstraints 属性以及按钮的生成:

import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class ScrollablePaneWithButtons {
    private static final int ROWS = 10;
    private static final int COLS = 3;

    private JFrame frame;
    private JPanel pane;
    private JButton[][] buttons;
    private GridBagConstraints gbc;
    private JScrollPane scroll;
    private JButton[] menuButtons;
    private JPanel menuPane;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new ScrollablePaneWithButtons()::createAndShowGui);
    }

    private void createAndShowGui() {
        frame = new JFrame(this.getClass().getSimpleName());

        pane = new JPanel();
        pane.setLayout(new GridBagLayout());
        
        menuPane = new JPanel();
        menuPane.setLayout(new GridLayout(1, 3));

        buttons = new JButton[ROWS][COLS];
        
        menuButtons = new JButton[] {new JButton("Edit"), new JButton("Delete"), new JButton("Sort Fields")};

        gbc = new GridBagConstraints();

        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.anchor = GridBagConstraints.PAGE_START;
        gbc.weightx = 0.5;

        for (int i = 0; i < ROWS; i++) {
            for (int j = 0; j < COLS; j++) {
                buttons[i][j] = new JButton("Button " + (j + 1));

                gbc.gridx = j;
                gbc.gridy = i;

                pane.add(buttons[i][j], gbc);
            }
        }

        scroll = new JScrollPane(pane, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        
        for (JButton b : menuButtons) {
            menuPane.add(b);
        }
        frame.add(scroll);
        frame.add(menuPane, BorderLayout.SOUTH);

        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

而且这个例子(在我看来)更容易阅读和跟进。这是上面代码生成的输出:

您仍然可以选择要使用的代码,可以在此答案的第一部分进行修改,第二部分按照上述建议进行修改,或者最后一个更短。

关于Java JScrollpane 不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47774639/

有关Java JScrollpane 不可见的更多相关文章

  1. ruby - 使用 Ruby CSV 创建 Rails 记录,其中字符串字段不可查询 - 2

    我正在尝试将种子数据从CSV文件加载到我的Rails应用程序中。我最初安装了fastercsvgem,却发现从ruby​​1.9开始,fastercsv已被弃用,取而代之的是CSV库。所以在收到一个非常有用的错误告诉我切换后,我切换到CSV。然而,现在我遇到了最奇怪的现象,当我加载数据时一切看起来都很正常,但我似乎无法查询字符串字段。字符串字段由看似正确的字符串填充,但我无法访问它们。我可以查询任何数字字段,结果将返回,但不会返回字符串字段。我尝试使用引号的定界符,但无济于事。我什至从我的csv文件中删除了所有引号,但我仍然无法查询字符串字段。下面是我的代码,以及一些来自Rails控制

  2. ruby - IO::EAGAINWaitReadable:资源暂时不可用 - 读取会阻塞 - 2

    当我尝试使用“套接字”库中的方法“read_nonblock”时出现以下错误IO::EAGAINWaitReadable:Resourcetemporarilyunavailable-readwouldblock但是当我通过终端上的IRB尝试时它工作正常如何让它读取缓冲区? 最佳答案 IgetthefollowingerrorwhenItrytousethemethod"read_nonblock"fromthe"socket"library当缓冲区中的数据未准备好时,这是预期的行为。由于异常IO::EAGAINWaitReadab

  3. ruby-on-rails - capybara 错误:Selenium::WebDriver::Error::ElementNotVisibleError:元素不可见 - 2

    我正在使用TrixWYSIWYGeditor在我的应用程序中。对于我的capybara测试:我要填写编辑器。我找到了这篇文章:Howtotestbasecamp'stripeditor...这似乎很有希望。不幸的是,它一直给我这个错误:Selenium::WebDriver::Error::ElementNotVisibleError:elementnotvisible所以看起来Capybara发现元素没问题,但它只是没有与之交互,因为Capybara必须有一些默认设置才能不与隐藏/不可见元素交互。环顾四周后,我发现了这个Stackoverflow问题:Isitpossibletoin

  4. ruby-on-rails - 为什么 Array.count 在开发模式下可用但在生产模式下不可用? - 2

    对于最近的一个项目,我有几个View是这样的代码:这在开发模式下工作得很好......我将它推出到生产模式并且它爆炸了,说count不是Array的有效方法。我将每个实例都改为使用Array#length,它似​​乎可以正常工作。1)这种行为差异的原因是什么?2)我应该注意开发模式和生产模式之间的任何其他令人兴奋的差异吗?道德:确保您的生产托管环境使用与本地开发环境相同的Ruby版本。:)谢谢汤姆 最佳答案 count方法仅在Ruby1.9及更高版本中可用。我建议您使用与服务器相同版本的Ruby以避免此类问题-1.9中发生了很多变化

  5. ruby-on-rails - 将配置文件模型的某些属性设置为对其他用户公开(可见)或私有(private)(不可见)的最佳方法是什么? - 2

    我有一个Profile模型,它有很多属性,比如电子邮件、图像、年龄、地址等。最终用户可以将某些属性设为私有(private),以便其他用户无法查看。我通过向表private_attr添加一列并将其序列化以存储哈希来解决这个问题:-{email:true,address:true,age:false}这里的属性作为具有值true的键被认为是私有(private)的,不会向除这些属性所属的用户以外的用户显示。我想知道这是解决这个问题的最好方法,还是有其他方法。提前致谢。 最佳答案 我认为您可以只序列化用户希望在数组中私有(private

  6. ruby - 如何删除 ruby 中的不可打印/不可见字符? - 2

    有时我在字符串中间有邪恶的不可打印字符。这些字符串是用户输入的,所以我必须让我的程序很好地接收它,而不是试图改变问题的根源。例如,他们可以有zerowidthno-breakspace在字符串的中间。例如,在解析.po文件时,一个有问题的部分是文件中间的字符串"heisamanofgod"。虽然一切看起来都是正确的,但使用irb检查它会显示:"heisamanofgod".codepoints=>[104,101,32,105,115,32,97,32,65279,109,97,110,32,111,102,32,103,111,100]我相信我知道什么是BOM,而且我什至能很好地处理

  7. 解决台式机麦克风不可用问题,只有音频输出,无音频输入 - 2

    解决台式机麦克风不可用问题戴尔灵越3880最近因为需要开线上会议,发现戴尔台式机音频只有输出没有输入,也就是只能听见声音,无法输入声音。先后尝试了各种驱动安装更新之类的调试,无果。之后通过戴尔支持解决~这里多说一句,专业的就是专业,问题描述过去,直接给了解决方案,可能是他们遇到的相似问题比较多了,但也告诉我们,有些时候是可以通过这些官方服务解决问题的,比起自己折腾效率要高很多。那就记录一下吧~问题描述:电脑只能输出声音,不能输入声音。1、前提需要准备一只带麦克风的耳机,将耳机插入面板。2、先确定是否可以听到声音,可以通过播放歌曲或者视频。3、然后确认麦克风是否可用,可以通过调用win自带麦克风

  8. ruby - 修复不可读的 ghostscript 字体 - 2

    我正在使用rubyScruffygem来创建一些图表。它依赖于RMagick来渲染文本和创建png。当我运行我的ruby​​脚本时,出现此错误。sh:gs:commandnotfoundsh:gs:commandnotfound/Users/natebird/.rvm/gems/ree-1.8.7-2011.03/gems/scruffy-0.2.6/lib/scruffy/rasterizers/rmagick_rasterizer.rb:15:in`from_blob':unabletoreadfont`/usr/local/share/ghostscript/fonts/n019

  9. ruby - 硬件不可能? : "Create a rock paper scissors program in ruby WITHOUT using conditionals" - 2

    我正在上介绍性软件开发课,我的作业是创建一个带有两个参数的剪刀石头布程序(石头,纸)等,并返回获胜的arg。现在,如果我可以使用条件语句,我会快速解决这个问题,但作业说我们需要知道的一切都在前三个ruby教科书的章节,这些章节不包括条件!没有它们是否可以创建这个程序?或者他只是希望我们足智多谋并使用条件句?这是一个非常简单的条件分配......我在想我可能在这里遗漏了一些东西。编辑:我正在考虑那个chmod数字系统,并认为通过该加法系统可能有解决方案...... 最佳答案 这是一个只使用哈希的方法:RULES={:rock=>{:r

  10. ruby - 在 ruby​​/ActiveRecord 中生成类似 Instagram 或 Youtube 的不可猜测的字符串 ID - 2

    在创建给定ActiveRecord模型对象的实例后,我需要生成一个简短的(6-8个字符)唯一字符串用作URL中的标识符,采用Instagram照片URL的样式(如http://instagram.com/p/P541i4ErdL/,它我只是争先恐后地成为404)或Youtube的视频网址(如http://www.youtube.com/watch?v=oHg5SJYRHA0)。执行此操作的最佳方法是什么?最简单的是createarandomstring重复直到它是唯一的?有没有一种方法可以对整数ID进行散列/洗牌,使用户无法通过更改一个字符来破解URL(就像我对上面的404'sInst

随机推荐