有几次我因为建议使用以下方法而受到批评:
在Swing组件上.当我想在显示的组件之间定义比例时,我没有看到任何替代它们的用法.我被告知这个:
对于布局,答案总是相同的:使用合适的LayoutManager
我在网上搜索了一下,但我没有找到任何关于这个主题的综合分析.所以我有以下问题:
在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即使大多数永远不会被使用?
在对话框中,如果选中某个组合,则需要显示一组控件,否则显示另一组控件.即我需要2层,我需要在选中/取消选中组合时在它们之间切换.我怎样才能做到这一点?
谢谢
我有一个应用程序产生几个全屏 - 无装饰框架(基本上控制所有屏幕空间).我的问题是,某些帧上的某些按钮被设计为"切换屏幕",这基本上意味着显示另一帧而不是当前帧.
我在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,我开始研究这个应用程序,因为我想加深我对JAVA,架构和模式的整体了解.我想按照指南来制作一个可重用,低耦合的应用程序,就像它应该的那样.该应用程序只有一个JFrame,但在其中有几个JPanel,每个JPanel代表一个应用程序的模块.
问题是:在JAVA Swing中,如何实现适当的MVC模式?我在如何理解它应该如何完成的方式上挣扎.
我是否应该拥有一个主控制器类,它包含对所有其他控制器的引用?(我有一张图片来证明这一点,在这里:https://docs.google.com/file/d/0B7tBdn5slIFeY2FoSmxESTREQ1k/edit?usp =sharing)
在这种情况下,是否所有需要更改正在呈现的模块的事件都会重定向到主控制器?
或者我应该将JFrame与应用程序的控制器耦合,并直接与它们通信?
基本上,我想知道我是否需要一个"管理"所有其他课程.我已经阅读了几个解释和不同的意见,但我相信这有点具体.
希望我已经清楚了(并希望我的解释比我的绘图更好:)).
编辑: 应用程序用法的示例:
菜单(View)是否应该拥有自己的Controller,并且此Controller与JFrame通信?JFrame将新模块加载到它的布局中?或者JFrame应该有自己的控制器(或模型,如Gilbert Le Blanc所说)?
我知道这可能看似具体,或易于理解,但每当我想到桌面应用程序时,我都很难理解这一点.
我怎样才能破坏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认为问题......
我有一个使用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) 我已经开始使用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是一个要求.
帮助将受到高度赞赏
我有一个 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; 导入 …
我有个问题.我有一个主框架,在左边我有一个带菜单的侧边栏.我的问题是,是否可以在主框架内制作另一个面板,这样如果单击menu1,相关内容应显示在主框架的后半部分,当按下其他菜单时,显然相关的内容根据选择什么.它有点难以解释,抱歉.有没有人有一个想法,是否可以在Java中使用Eclipse?
java ×10
swing ×10
cardlayout ×4
jpanel ×4
jframe ×2
awt ×1
concurrency ×1
controller ×1
frame ×1
jfreechart ×1
linux ×1
netbeans ×1