java swing编程注意的一些问题

简介:

总结一下我在Java swing 编程实践中的一些经验以及要注意的问题

(1)如何在启动swing界面时指定组件(文本框)聚焦呢?

范例:

Java代码   收藏代码
  1. CreateMD5App frame = new CreateMD5App();  
  2.                     frame.setVisible(true);  
  3.                     frame.pathTF.requestFocus();  

 注意requestFocus();放在this.setVisible(true);之后

 

(2)如何响应文本框的输入事件(有输入操作时触发的事件)

titleTF的类型是JTextArea

Java代码   收藏代码
  1. titleTF.getDocument().addDocumentListener(new DocumentListener() {  
  2.   
  3.                 @Override  
  4.                 public void removeUpdate(DocumentEvent e) {  
  5.                     // System.out.println("remove");  
  6.                     try {  
  7.                         checkTitle(titleTF);  
  8.                     } catch (Exception e1) {  
  9.                         e1.printStackTrace();  
  10.                     }  
  11.                 }  
  12.   
  13.                 @Override  
  14.                 public void insertUpdate(DocumentEvent e) {  
  15.                     // System.out.println("insert");  
  16.                     try {  
  17.                         checkTitle(titleTF);  
  18.                     } catch (Exception e1) {  
  19.                         e1.printStackTrace();  
  20.                     }  
  21.                 }  
  22.   
  23.                 @Override  
  24.                 public void changedUpdate(DocumentEvent e) {  
  25.                     // System.out.println("change");  
  26.                 }  
  27.             });  

 

(3)panel增加组件时,出现水平滚动条,而不是竖直滚动条。要求出现竖直滚动条,怎么办?

要求的效果:

 实现方法:

Java代码   收藏代码
  1. otherRequestArgPane = new JPanel();// must be in front of  
  2.                                             // getAddNextButton() method  
  3.   
  4.         otherRequestArgPane.setAutoscrolls(true);  
  5.         // 让panel 只显示竖直滚动条  
  6.         otherRequestArgPane.setLayout(new ModifiedFlowLayout());  
  7.         otherRequestArgJsPane = new JScrollPane(otherRequestArgPane);  
  8.         otherRequestArgJsPane.getHorizontalScrollBar().setAutoscrolls(false);  
  9.         otherRequestArgJsPane.getVerticalScrollBar().setAutoscrolls(true);  

 说明:把JPanel放在JScrollPane中。

ModifiedFlowLayout 是自定义的布局管理器,代码如下:

Java代码   收藏代码
  1. package com.swing.component;  
  2.   
  3. import java.awt.Component;  
  4. import java.awt.Container;  
  5. import java.awt.Dimension;  
  6. import java.awt.FlowLayout;  
  7. import java.awt.Insets;  
  8.   
  9. public class ModifiedFlowLayout extends FlowLayout {  
  10.     private static final long serialVersionUID = 5426056229476897767L;  
  11.   
  12.     public ModifiedFlowLayout() {  
  13.         super();  
  14.     }  
  15.   
  16.     public ModifiedFlowLayout(int align) {  
  17.         super(align);  
  18.     }  
  19.   
  20.     public ModifiedFlowLayout(int align, int hgap, int vgap) {  
  21.         super(align, hgap, vgap);  
  22.     }  
  23.   
  24.     public Dimension minimumLayoutSize(Container target) {  
  25.         // Size of largest component, so we can resize it in  
  26.         // either direction with something like a split-pane.  
  27.         return computeMinSize(target);  
  28.     }  
  29.   
  30.     public Dimension preferredLayoutSize(Container target) {  
  31.         return computeSize(target);  
  32.     }  
  33.   
  34.     private Dimension computeSize(Container target) {  
  35.         synchronized (target.getTreeLock()) {  
  36.             int hgap = getHgap();  
  37.             int vgap = getVgap();  
  38.             int w = target.getWidth();  
  39.             // Let this behave like a regular FlowLayout (single row)  
  40.             // if the container hasn't been assigned any size yet  
  41.             if (w == 0) {  
  42.                 w = Integer.MAX_VALUE;  
  43.             }  
  44.             Insets insets = target.getInsets();  
  45.             if (insets == null) {  
  46.                 insets = new Insets(0000);  
  47.             }  
  48.             int reqdWidth = 0;  
  49.             int maxwidth = w - (insets.left + insets.right + hgap * 2);  
  50.             int n = target.getComponentCount();  
  51.             int x = 0;  
  52.             int y = insets.top + vgap;// FlowLayout starts by adding vgap, so do  
  53.                                         // that here too.  
  54.             int rowHeight = 0;  
  55.             for (int i = 0; i < n; i++) {  
  56.                 Component c = target.getComponent(i);  
  57.                 if (c.isVisible()) {  
  58.                     Dimension d = c.getPreferredSize();  
  59.                     if ((x == 0) || ((x + d.width) <= maxwidth)) {  
  60.                         // fits in current row.  
  61.                         if (x > 0) {  
  62.                             x += hgap;  
  63.                         }  
  64.                         x += d.width;  
  65.                         rowHeight = Math.max(rowHeight, d.height);  
  66.                     } else {  
  67.                         // Start of new row  
  68.                         x = d.width;  
  69.                         y += vgap + rowHeight;  
  70.                         rowHeight = d.height;  
  71.                     }  
  72.                     reqdWidth = Math.max(reqdWidth, x);  
  73.                 }  
  74.             }  
  75.             y += rowHeight;  
  76.             y += insets.bottom;  
  77.             return new Dimension(reqdWidth + insets.left + insets.right, y);  
  78.         }  
  79.     }  
  80.   
  81.     private Dimension computeMinSize(Container target) {  
  82.         synchronized (target.getTreeLock()) {  
  83.             int minx = Integer.MAX_VALUE;  
  84.             int miny = Integer.MIN_VALUE;  
  85.             boolean found_one = false;  
  86.             int n = target.getComponentCount();  
  87.             for (int i = 0; i < n; i++) {  
  88.                 Component c = target.getComponent(i);  
  89.                 if (c.isVisible()) {  
  90.                     found_one = true;  
  91.                     Dimension d = c.getPreferredSize();  
  92.                     minx = Math.min(minx, d.width);  
  93.                     miny = Math.min(miny, d.height);  
  94.                 }  
  95.             }  
  96.             if (found_one) {  
  97.                 return new Dimension(minx, miny);  
  98.             }  
  99.             return new Dimension(00);  
  100.         }  
  101.     }  
  102. }  

 

(4)如何获取下拉框中选中的内容(不是index)

下拉框类型是JComboBox,初始化下拉框:

Java代码   收藏代码
  1. encodingComboBox = new JComboBox();  
  2.         // 设置下拉框中的选项  
  3.         for (int i = 0; i < SystemUtil.CHARSET_ARRAY.length; i++) {  
  4.             String charSet = SystemUtil.CHARSET_ARRAY[i];  
  5.             encodingComboBox.addItem(charSet);  
  6.         }  

 获取下拉框选中的内容:

Java代码   收藏代码
  1. String charset = (String) encodingComboBox.getSelectedItem();  

 界面如下:

 

相关文章
|
1月前
|
Java 程序员
Java编程中的异常处理:从基础到高级
在Java的世界中,异常处理是代码健壮性的守护神。本文将带你从异常的基本概念出发,逐步深入到高级用法,探索如何优雅地处理程序中的错误和异常情况。通过实际案例,我们将一起学习如何编写更可靠、更易于维护的Java代码。准备好了吗?让我们一起踏上这段旅程,解锁Java异常处理的秘密!
|
15天前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
19天前
|
算法 Java 调度
java并发编程中Monitor里的waitSet和EntryList都是做什么的
在Java并发编程中,Monitor内部包含两个重要队列:等待集(Wait Set)和入口列表(Entry List)。Wait Set用于线程的条件等待和协作,线程调用`wait()`后进入此集合,通过`notify()`或`notifyAll()`唤醒。Entry List则管理锁的竞争,未能获取锁的线程在此排队,等待锁释放后重新竞争。理解两者区别有助于设计高效的多线程程序。 - **Wait Set**:线程调用`wait()`后进入,等待条件满足被唤醒,需重新竞争锁。 - **Entry List**:多个线程竞争锁时,未获锁的线程在此排队,等待锁释放后获取锁继续执行。
54 12
|
15天前
|
存储 安全 Java
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
98 2
|
15天前
|
存储 IDE Java
漂亮不是梦!Java Swing美化攻略
Java Swing 是一个为 Java 设计的 GUI 工具包,提供文本框、按钮等组件。尽管其外观可定制,通过 Look and Feel(LAF)机制改变应用风格,如 Darcula 和 FlatLaf,但现已淡出主流视野,主要应用于 IDE 领域,如 IntelliJ IDEA 和 Eclipse。相比其他 GUI 框架,Swing 的发展前景有限。
38 1
|
2月前
|
设计模式 Java 开发者
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####
|
2月前
|
缓存 Java 开发者
Java多线程编程的陷阱与最佳实践####
本文深入探讨了Java多线程编程中常见的陷阱,如竞态条件、死锁和内存一致性错误,并提供了实用的避免策略。通过分析典型错误案例,本文旨在帮助开发者更好地理解和掌握多线程环境下的编程技巧,从而提升并发程序的稳定性和性能。 ####
|
1月前
|
安全 算法 Java
Java多线程编程中的陷阱与最佳实践####
本文探讨了Java多线程编程中常见的陷阱,并介绍了如何通过最佳实践来避免这些问题。我们将从基础概念入手,逐步深入到具体的代码示例,帮助开发者更好地理解和应用多线程技术。无论是初学者还是有经验的开发者,都能从中获得有价值的见解和建议。 ####
|
1月前
|
Java 调度
Java中的多线程编程与并发控制
本文深入探讨了Java编程语言中多线程编程的基础知识和并发控制机制。文章首先介绍了多线程的基本概念,包括线程的定义、生命周期以及在Java中创建和管理线程的方法。接着,详细讲解了Java提供的同步机制,如synchronized关键字、wait()和notify()方法等,以及如何通过这些机制实现线程间的协调与通信。最后,本文还讨论了一些常见的并发问题,例如死锁、竞态条件等,并提供了相应的解决策略。
51 3
|
1月前
|
开发框架 安全 Java
Java 反射机制:动态编程的强大利器
Java反射机制允许程序在运行时检查类、接口、字段和方法的信息,并能操作对象。它提供了一种动态编程的方式,使得代码更加灵活,能够适应未知的或变化的需求,是开发框架和库的重要工具。
52 3