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();  

 界面如下:

 

相关文章
|
7天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
21 2
|
10天前
|
Java
死磕-java并发编程技术(二)
死磕-java并发编程技术(二)
|
10天前
|
存储 Java 调度
死磕-java并发编程技术(一)
死磕-java并发编程技术(一)
|
10天前
|
设计模式 缓存 Java
死磕-高效的Java编程(一)
死磕-高效的Java编程(一)
|
10天前
|
算法 安全 Java
JAVA并发编程系列(12)ThreadLocal就是这么简单|建议收藏
很多人都以为TreadLocal很难很深奥,尤其被问到ThreadLocal数据结构、以及如何发生的内存泄漏问题,候选人容易谈虎色变。 日常大家用这个的很少,甚至很多近10年资深研发人员,都没有用过ThreadLocal。本文由浅入深、并且才有通俗易懂方式全面分析ThreadLocal的应用场景、数据结构、内存泄漏问题。降低大家学习啃骨头的心理压力,希望可以帮助大家彻底掌握并应用这个核心技术到工作当中。
|
10天前
|
Java 程序员 编译器
死磕-高效的Java编程(二)
死磕-高效的Java编程(二)
|
5天前
|
Java
JAVA并发编程系列(13)Future、FutureTask异步小王子
本文详细解析了Future及其相关类FutureTask的工作原理与应用场景。首先介绍了Future的基本概念和接口方法,强调其异步计算特性。接着通过FutureTask实现了一个模拟外卖订单处理的示例,展示了如何并发查询外卖信息并汇总结果。最后深入分析了FutureTask的源码,包括其内部状态转换机制及关键方法的实现原理。通过本文,读者可以全面理解Future在并发编程中的作用及其实现细节。
|
8天前
|
Java 数据处理 调度
Java中的多线程编程:从基础到实践
本文深入探讨了Java中多线程编程的基本概念、实现方式及其在实际项目中的应用。首先,我们将了解什么是线程以及为何需要多线程编程。接着,文章将详细介绍如何在Java中创建和管理线程,包括继承Thread类、实现Runnable接口以及使用Executor框架等方法。此外,我们还将讨论线程同步和通信的问题,如互斥锁、信号量、条件变量等。最后,通过具体的示例展示了如何在实际项目中有效地利用多线程提高程序的性能和响应能力。
|
9天前
|
安全 算法 Java
Java中的多线程编程:从基础到高级应用
本文深入探讨了Java中的多线程编程,从最基础的概念入手,逐步引导读者了解并掌握多线程开发的核心技术。无论是初学者还是有一定经验的开发者,都能从中获益。通过实例和代码示例,本文详细讲解了线程的创建与管理、同步与锁机制、线程间通信以及高级并发工具等主题。此外,还讨论了多线程编程中常见的问题及其解决方案,帮助读者编写出高效、安全的多线程应用程序。
|
11天前
|
存储 缓存 Java
JAVA并发编程系列(11)线程池底层原理架构剖析
本文详细解析了Java线程池的核心参数及其意义,包括核心线程数量(corePoolSize)、最大线程数量(maximumPoolSize)、线程空闲时间(keepAliveTime)、任务存储队列(workQueue)、线程工厂(threadFactory)及拒绝策略(handler)。此外,还介绍了四种常见的线程池:可缓存线程池(newCachedThreadPool)、定时调度线程池(newScheduledThreadPool)、单线程池(newSingleThreadExecutor)及固定长度线程池(newFixedThreadPool)。
下一篇
无影云桌面