我正在制作一个有趣的物理模拟器,当我试图弄清楚所有这些J之间的区别时,我正在查找图形教程.有人可以详细说明它们,或者提供一个有用的来源链接吗?
我一直想用Java创建自定义组件,或者自定义现有组件,但我的搜索从未产生任何有用的东西.所以我决定问StackOverflow社区:
我在哪里可以找到有关自定义Java GUI组件的信息?
当我的意思是定制时,我不是在谈论改变颜色,字体等等.我的意思是真正定制它们.这是两个模型示例组件:

注释
我开始这个问题主要是为了找到如何创建上面两个自定义组件.但后来我意识到关于黑客摇摆组件的问题并不存在.所以我认为最好有一份资源清单.
如果您想知道模型中的两个组件如何工作,这里是:
一个自定义的JScrollPane,每个方向都有两个Scrollbar.每个滚动条的行为都不同.例如,外部滚动正常,内部滚动以类似Picasa的方式移动视图.事实上,我从谷歌组工作(!)答案在这里,但那只是代码.
第二个是自定义JComboBox,当扩展弹出列表时,它最后有一个JComponent.这可以是任何东西,从带有图标的简单JLabel到以某种方式操纵列表的JButton.
但这个问题不是关于那些具体的组成部分.它是关于寻找资源(网站,书籍,文章等)来学习如何创建它们.
我正在尝试(测试其他东西)将一个JButton引用添加到两个中JPanels进行测试,它会从添加到的第一个面板中消失!
那么,不能将Swing组件添加到多个容器中吗?
先感谢您.
在Swing中,最好的方法是让JSplitPane分割两个jpanel,每个jpanel的大小为50%.
看起来如果我没有在面板上设置首选尺寸,它总是使第一个面板几乎不可见(2%),第二个面板几乎不可见(98%)
提前致谢
是否有一些规则,或好/坏经验AncestorListener,ComponentListener或HierarchyListener听取变化的可见性JPanel和JComponents?
其中一个比其他人更好还是更安全?我特别想知道何时以及如何JPanel/ JComponent隐藏.
请注意以下代码包含不正确的Swing规则,例如Thread.sleep(int)在这种情况下使用,允许我Listeners在Swing GUI中打印出正确的顺序
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.HierarchyEvent;
import java.awt.event.HierarchyListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
public class CardlayoutTest extends JFrame {
private static final long serialVersionUID = 1L;
public CardLayout card = new CardLayout();
public CardlayoutTest() {
JPanel pnlA = new JPanel(new BorderLayout());
pnlA.add(new JButton("A"), BorderLayout.CENTER);
JPanel pnlB = new JPanel(new …Run Code Online (Sandbox Code Playgroud) 我有这个代码来获取我需要的所有元素并进行一些处理.问题是我需要指定每个面板来获取其中的元素.
for (Component c : panCrawling.getComponents()) {
//processing
}
for (Component c : panFile.getComponents()) {
//processing
}
for (Component c : panThread.getComponents()) {
//processing
}
for (Component c : panLog.getComponents()) {
//processing
}
//continue to all panels
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情,并获得所有的元素,而不需要specefy所有的面板名称.我是怎么做到的 下面的代码没有获得所有元素.
for (Component c : this.getComponents()) {
//processing
}
Run Code Online (Sandbox Code Playgroud) 我试图在Swing中触及MVC架构的限制,但是当我尝试所有(来自SwingWorker或Runnable#Thread)在EDT上完成时
我的问题:
是否有一些限制或严格依赖于实现的顺序(包装SwingWorker或Runnable#Thread)?
有限的是JComponent#方法线程安全吗?
Swing中MVC架构的本质特征是什么?
INC.集装箱重新布局?
注意:对于我,SSCCE我采取了一个很好的例子HFOE,并且可能通过严格控制这个原则是不可能创建任何EDT缺乏或GUI冻结

import java.awt.BorderLayout;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.LinkedList;
import java.util.Queue;
import javax.swing.*;
public class MVC_ProgressBarThread {
private MVC_ProgressBarThread() {
MVC_View view = new MVC_View();
MVC_Model model = new MVC_Model();
MVC_Control control = new MVC_Control(view, model);
view.setControl(control);
JFrame frame = new JFrame("MVC_ProgressBarThread");
frame.getContentPane().add(view);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() …Run Code Online (Sandbox Code Playgroud) 我有一个充满JTextFields的JPanel ......
for (int i=0; i<maxPoints; i++) {
JTextField textField = new JTextField();
points.add(textField);
}
Run Code Online (Sandbox Code Playgroud)
我以后如何在该JPanel中获取JTextField?就像我想要他们的价值观一样
TextField.getText();
Run Code Online (Sandbox Code Playgroud)
谢谢
我的理解: 与Swing中的大多数组件/操作不同,对JComponent.repaint()的调用是线程安全的,即虽然重新绘制请求来自另一个线程(即不是来自EDT),但实际绘制仅在EDT中进行.下面的代码片段演示了这一点.
public class PaintingDemo {
public static void main(String[] args) {
final JFrame frame = new JFrame();
final JPanel p = new MyPanel();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
frame.add(p, BorderLayout.CENTER);
frame.setSize(200, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
new Thread("MyThread") {
public void run() {
while (true) {
// Below statements are important to show the difference
p.repaint();
p.paintImmediately(p.getBounds());
try {
Thread.sleep(1000);
} catch(Exception e) {}
}
}
}.start();
}
}
class MyPanel extends JPanel {
@Override
public …Run Code Online (Sandbox Code Playgroud) 所以在最近的一个回答中,有人评论过此(关于绘画):
"这可能是90%Swing程序员的某种疾病:当他们制作自己的组件时,他们总是扩展JPanel而不是JComponent.为什么?"
我仍然是编程方面的新手,所以我认为现在称自己为Swing程序员为时尚早,因为我尚未找到自己的位置.但压倒一切JPanel只是我教的方式.所以我开始找到"为什么?"的答案.评论者的问题.这些是我找到的一些答案.
背景画是主要的区别.JComponent类不绘制其背景,因此您必须在重写的paintComponent方法中绘制背景.相比之下,JPanel有一个不透明的背景,可以通过调用它的paintComponennt方法来绘制.
一些程序员喜欢扩展JPanel类,而不是扩展JComponent.JPanel旨在成为可以包含其他组件的容器,但也可以在其上绘制.只有一个区别.面板是不透明的,这意味着它负责绘制其边界内的所有像素.最简单的方法是使用背景颜色绘制面板,方法是在每个面板子类的paintComponent方法中调用super.paintComponent:
如果将opaque属性设置为true ...那么Swing绘图系统不必浪费时间尝试在组件后面进行绘制,从而提高性能.
我认为最后一句话真的解释得最好.但是,除了透明度外,还有其他有益的原因"90%的Swing程序员都有这样的疾病"延伸JPanel,而不是JComponent?