相关疑难解决方法(0)

我应该避免在Java Swing中使用set(Preferred | Maximum | Minimum)Size方法吗?

有几次我因为建议使用以下方法而受到批评:

  1. 有必要对setPreferredSize
  2. 了setMinimumSize
  3. setMaximumSize

Swing组件上.当我想在显示的组件之间定义比例时,我没有看到任何替代它们的用法.我被告知这个:

对于布局,答案总是相同的:使用合适的LayoutManager

我在网上搜索了一下,但我没有找到任何关于这个主题的综合分析.所以我有以下问题:

  1. 我应该完全避免使用这些方法吗?
  2. 已经定义了这些方法的原因.那我什么时候应该使用它们?在哪种情况下?出于什么目的?
  3. 使用这些方法的负面后果究竟是什么?(我只能考虑在具有不同屏幕分辨率的系统之间添加可移植性).
  4. 我认为任何LayoutManager都不能完全满足所有需要的布局需求.我是否真的需要为布局上的每个小变化实现一个新的LayoutManager?
  5. 如果4的答案是"是",那么这是否会导致LayoutManager类的扩散变得难以维护?
  6. 在我需要定义组件子级之间的比例的情况下(例如,child1应该使用10%的空间,child2 40%,child3 50%),是否可以在不实现自定义LayoutManager的情况下实现这一点?

java swing layout-manager

471
推荐指数
8
解决办法
5万
查看次数

CardLayout与手动添加/删除JPanels有什么特别之处?

在StackOverflow上有很多次用户问这样的问题......

我有一个JPanel包含孩子的主人JPanel.当用户单击按钮时,孩子JPanel应该更改为其他JPanel.我怎样才能做到这一点.

通常,用户实际上已尝试实现此问题,但无法使其正常工作.

每当我回答这个问题时,我都会告诉他们做这样的事情(简单地说)......

JPanel myFrame = new JPanel();
myFrame.remove(oldPanel);
myFrame.add(newPanel);
Run Code Online (Sandbox Code Playgroud)

我认为这是一个非常合理的答案,我个人在我自己的许多Java项目中都没有使用过这个问题.但是,我总是得到我的回答,每个人只是说"使用CardLayout".

所以我的问题是,为什么每个人都如此着迷CardLayout,以至于我的答案值得进行投票?为什么我应该CardLayout使用上面的代码选择使用而不是添加/删除面板?

作为进一步的问题,您是否仍然建议CardLayout使用具有动态JPanel的接口.例如,我的大多数程序都实现了一个自定义插件框架,其中可能有数百个JPanels,但我只是加载并显示实际需要的面板.对于程序的正常使用,大多数面板实际上永远不会被加载或需要.对于这种类型的场景,我的编码方法是否是最好的解决方案,据我所知,这CardLayout将需要我实际创建所有的,JPanels即使大多数永远不会被使用?

java swing jpanel layout-manager cardlayout

14
推荐指数
2
解决办法
1408
查看次数

如何根据组合框选择更改UI

在对话框中,如果选中某个组合,则需要显示一组控件,否则显示另一组控件.即我需要2层,我需要在选中/取消选中组合时在它们之间切换.我怎样才能做到这一点?

谢谢

java user-interface swing cardlayout

6
推荐指数
1
解决办法
7425
查看次数

全屏Swing框架在Linux中无法正确聚焦(Windows很好)

我有一个应用程序产生几个全屏 - 无装饰框架(基本上控制所有屏幕空间).我的问题是,某些帧上的某些按钮被设计为"切换屏幕",这基本上意味着显示另一帧而不是当前帧.

我在Windows中使用以下方法轻松实现了这一目标:

target.setVisible(true);
target.requestFocus();
this.parent.setVisible(false);
Run Code Online (Sandbox Code Playgroud)

target我要切换到的框架在哪里.这是有效的,因为最初,我将所有帧设置为除了第一个"主"帧之外不可见.

现在,当我将其移植到Linux环境中时,在更改帧时会出现一个丑陋的"闪烁".在这一瞬间,我可以看到我的桌面背景和我在应用程序后面存在的任何打开的窗口.我之前在Windows中遇到过这个问题并通过聚焦目标帧来修复它,然后使旧的不可见.

关于如何解决这个Linux特定问题的任何想法?

编辑:

setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setUndecorated(true);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(0,0,screenSize.width, screenSize.height);
this.getContentPane().setLayout(null);
setVisible(true);
validate();
Run Code Online (Sandbox Code Playgroud)

java linux swing frame

5
推荐指数
2
解决办法
1187
查看次数

JAVA Swing MVC - 主控制器?

我在设计我正在尝试开发的应用程序的体系结构时遇到了一些麻烦.我正在研究JAVA,我开始研究这个应用程序,因为我想加深我对JAVA,架构和模式的整体了解.我想按照指南来制作一个可重用,低耦合的应用程序,就像它应该的那样.该应用程序只有一个JFrame,但在其中有几个JPanel,每个JPanel代表一个应用程序的模块.

问题是:在JAVA Swing中,如何实现适当的MVC模式?我在如何理解它应该如何完成的方式上挣扎.

我是否应该拥有一个主控制器类,它包含对所有其他控制器的引用?(我有一张图片来证明这一点,在这里:https://docs.google.com/file/d/0B7tBdn5slIFeY2FoSmxESTREQ1k/edit?usp =sharing)

在这种情况下,是否所有需要更改正在呈现的模块的事件都会重定向到主控制器?

或者我应该将JFrame与应用程序的控制器耦合,并直接与它们通信?

基本上,我想知道我是否需要一个"管理"所有其他课程.我已经阅读了几个解释和不同的意见,但我相信这有点具体.

希望我已经清楚了(并希望我的解释比我的绘图更好:)).

编辑: 应用程序用法的示例:

  • 应用程序的整个生命周期中的一个(仅一个)JFrame;
  • 菜单将在左侧,如BorderLayout.WEST;
  • 应用程序的当前模块将位于中心,如BorderLayout.CENTER;
  • 当用户按下菜单的一个按钮时,相应的模块被加载到BorderLayout.CENTER;

菜单(View)是否应该拥有自己的Controller,并且此Controller与JFrame通信?JFrame将新模块加载到它的布局中?或者JFrame应该有自己的控制器(或模型,如Gilbert Le Blanc所说)?

我知道这可能看似具体,或易于理解,但每当我想到桌面应用程序时,我都很难理解这一点.

java model-view-controller swing controller

5
推荐指数
1
解决办法
4942
查看次数

销毁Jframe对象

我怎样才能破坏Jframe对象(就像不应该留下引用一样),因为我正在实现多用户登录系统,如app这样的用户可以添加歌曲删除歌曲.我有3帧loginFrame,adminFrame,nonAdminFrame .. loginFrame =登录,启动nonAdminFrame,其中添加删除歌曲照顾我正在处理登录,因为我有数据文件夹,其中.txt文件用于写有歌曲的用户对象信息类型链接列表.我登录的方式我查看数据文件夹,看看是否有.txt文件名为user1.txt文件,它将所有数据加载到nonadminFrame ...问题是登录不能正常工作,因为它引用旧的nonAdminFrame以前的用户数据仍然存在的地方......

我有3个类或3个JFrame.主类是loginFrame.我获取登录信息,看看用户是admin还是nonadmin,然后通过创建一个新的adminFrame()对象或nonAdminFrame()对象来显示admin或nonadminFrame,并设置loginFrame.setVisible(false); 问题出在nonAdminFrame,其中所有的itunes库都发生了.我有JTree显示该用户的所有歌曲,一旦点击退出我使用frame.dispose()处理nonAdmin帧但如果我再次使用不同的再次登录创建一个nonadminFrame()对象,我会看到旧用户的数据JTree认为问题......

java swing jframe

5
推荐指数
1
解决办法
2万
查看次数

Java如何在布局中添加图像作为背景

我有一个使用CardLayout的类,它有两张卡片,上面有一个按钮.我希望能够做的是放置一个像背景一样的图像,例如Windows中的桌面背景.该程序最终将有几张不同的卡片,我希望能够在每张卡片上放置不同的背景.我已尝试过在本网站上提出的其他类似问题中提出的许多建议,以及通过Google搜索我能找到的任何建议,但我似乎无法让它发挥作用.我知道使用CardLayout我不能将面板放在面板上,因此将图像放在JPanel上是行不通的.所以我的问题是,根据下面发布的代码,我有更好的方法来设置我的布局,以便它更好地工作,而且,我应该如何处理显示图像,使其在按钮的背景中?任何帮助将不胜感激.

import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.*;

public class Cards implements ActionListener {    
private JPanel cards;
private JButton button1;
private JButton button2;
private Image backgroundImage;

public void addComponentToPane(Container pane) throws IOException {
    backgroundImage = ImageIO.read(new File("background.jpg"));

    //create cards
    JPanel card1 = new JPanel()
    {
        @Override
        public void paintComponent(Graphics g)
        {
            g.drawImage(backgroundImage, 0, 0, null);
        }
    };
    JPanel card2 = new JPanel();
    button1 = new JButton("Button 1");
    button2 = new JButton("Button 2");
    button1.addActionListener(this);
    button2.addActionListener(this);        
    card1.add(button1); …
Run Code Online (Sandbox Code Playgroud)

java swing jpanel paintcomponent cardlayout

4
推荐指数
2
解决办法
6365
查看次数

使用Cardlayout切换到特定的JPanel

我已经开始使用netbeans处理Java桌面应用程序了.我有7个不同的屏幕,代表我正在使用它们JPanel.一个JPanel代表它们,一个代码包含所有它们(命名为mainPanel),它位于JFrame中.mainPanel Cardlayout用于在屏幕之间切换(JPanels).我使用netbeans ui小部件构建了所有这个接口,即拖放.

布局

JFrame
    mainPanel (Jpanel) CardLayout
        Child1 (JPanel)
        Child2 (JPanel)
        .
        .
        .
        .
        Childn (Jpanel)
Run Code Online (Sandbox Code Playgroud)

我知道可以使用JPanel.next()和切换屏幕Jpanel.previous.但它们只能在连续屏幕之间进行切换时使用,即如果必须切换到直接邻居.还有一个方法JPanel.show()去一个特定的屏幕,但问题是,它需要一个参数name是一个String关联时,当你添加它来的mainPanel JPanel.add()功能.我已经使用拖放添加了所有内容,所以我不知道是什么String关联,如果有的话.虽然它看起来非常原始,但我已经完成了它,Cardlayout但这一次,Cardlayout是一个要求.

帮助将受到高度赞赏

java swing netbeans jpanel cardlayout

4
推荐指数
2
解决办法
2037
查看次数

JPanel 添加但未“及时”显示

我有一个 JFrame,它根据您单击的 MenuItem 显示 JPanel。它可以工作,但是现在我需要在将 JPanel 添加到框架并显示它后调用一个方法(因为我在该面板内使用 JFreeChart 并且我必须chartPanel.repaint()在 JPanel 可见时调用):

this.getContentPane().add( myjpanel, BorderLayout.CENTER ); //this = JFrame
this.validate();
myjpanel.methodCalledOnceDisplayed();
Run Code Online (Sandbox Code Playgroud)

看起来没问题吗?真的myjpanel被展示了吗?好像不是:

public void methodCalledOnceDisplayed() {
    chartPanel.repaint()
}
Run Code Online (Sandbox Code Playgroud)

这不起作用(chartPanel.getChartRenderingInfo().getPlotInfo().getSubplotInfo(0)正在抛出 IndexOutOfBoundsException)。这意味着调用重绘时 JPanel 不可见,我测试了以下内容:

public void methodCalledOnceDisplayed() {
    JOptionPane.showMessageDialog(null,"You should see myjpanel now");
    chartPanel.repaint()
}
Run Code Online (Sandbox Code Playgroud)

现在它起作用了,我myjpanel在警报后面看到了,正如预期的那样,重新绘制了 chartPanel 并且没有发生异常。

编辑:SSCCE(需要 jfreechart 和 jcommon:http ://www.jfree.org/jfreechart/download.html )

导入 java.awt.BorderLayout;
导入 java.awt.EventQueue;
导入 java.awt.Font;
导入 javax.swing.JButton;
导入 javax.swing.JFrame;
导入 javax.swing.JLabel;
导入 javax.swing.JOptionPane;
导入 javax.swing.JPanel;
导入 javax.swing.border.EmptyBorder;
导入 …

java concurrency swing jfreechart event-dispatch-thread

4
推荐指数
1
解决办法
3136
查看次数

两个不同的面板在一个框架 - Java

我有个问题.我有一个主框架,在左边我有一个带菜单的侧边栏.我的问题是,是否可以在主框架内制作另一个面板,这样如果单击menu1,相关内容应显示在主框架的后半部分,当按下其他菜单时,显然相关的内容根据选择什么.它有点难以解释,抱歉.有没有人有一个想法,是否可以在Java中使用Eclipse?

java swing awt jpanel jframe

2
推荐指数
1
解决办法
3万
查看次数