百度
360搜索
搜狗搜索

java swing组件,JAVA SWING中如何清除JPanel中的组件?详细介绍

本文目录一览: JAVA SWING中如何清除JPanel中的组件?

  你可以调用JPanel的remove方法,然后用add添加组件,最后更新重画就可以了。\x0d\x0a  一般想要移除和添加一个组件,可能是希望程序在运行时动态的移除和添加,所以你可以为要移除的组件设置一个监听器。\x0d\x0a  例如单击某一个组件就移除这个组件,并且添加另外的组件。例如,当单击按钮时,把按钮移除,添加一个文本框。下面是一个具体的例子:\x0d\x0a  package konw.win;\x0d\x0a  import java.awt.FlowLayout;\x0d\x0a  import java.awt.event.ActionEvent;\x0d\x0a  import java.awt.event.ActionListener;\x0d\x0a  import javax.swing.JButton;\x0d\x0a  import javax.swing.JFrame;\x0d\x0a  import javax.swing.JPanel;\x0d\x0a  import javax.swing.JTextField;\x0d\x0a  public class WinTest3\x0d\x0a  {\x0d\x0a  public static void main(String[] args)\x0d\x0a  {\x0d\x0a  \x0d\x0a  JFrame frame = new JFrame();\x0d\x0a  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\x0d\x0a  frame.setExtendedState(JFrame.MAXIMIZED_BOTH);\x0d\x0a  frame.setLayout(new FlowLayout());\x0d\x0a  JPanel panel = new JPanel();\x0d\x0a  JButton button = new JButton("change");\x0d\x0a  panel.add(button);\x0d\x0a  JTextField f = new JTextField(20);\x0d\x0a  ActionListener listener = new ChangeListener(button,panel,f);\x0d\x0a  button.addActionListener(listener);//注册监听器\x0d\x0a  frame.add(panel);\x0d\x0a  frame.setVisible(true);\x0d\x0a  \x0d\x0a  }\x0d\x0a  }\x0d\x0a  /*监听器,当单击按钮时,移除button按钮,加入text文本框*/\x0d\x0a  class ChangeListener implements ActionListener\x0d\x0a  {\x0d\x0a  JButton button;\x0d\x0a  JPanel panel;\x0d\x0a  JTextField text;\x0d\x0a  public ChangeListener(JButton button, JPanel panel, JTextField text)\x0d\x0a  {\x0d\x0a  super();\x0d\x0a  this.button = button;\x0d\x0a  this.panel = panel;\x0d\x0a  this.text = text;\x0d\x0a  }\x0d\x0a\x0d\x0a  @Override\x0d\x0a  public void actionPerformed(ActionEvent e)\x0d\x0a  {\x0d\x0a  if("change".equals(e.getActionCommand()))\x0d\x0a  {\x0d\x0a  panel.remove(button);\x0d\x0a  panel.add(text);\x0d\x0a  panel.updateUI();\x0d\x0a  panel.repaint();\x0d\x0a  }\x0d\x0a  }\x0d\x0a\x0d\x0a  }\x0d\x0a  需要特别注意的是移除和添加组件之后,记得重画组件。

Java的Swing组件使用了哪种设计模式 ?

【答案】:Java中的Swing组件使用了MVC(视图-模型-控制器)设计模式 。

Java Swing开发中的线程安全

  SwingAPI的设计目标是强大 灵活和易用 非凡地 我们希望能让程序员们方便地建立新的Swing组件 不论是从头开始还是通过扩展我们所提供的一些组件 出于这个目的 我们不要求Swing组件支持多线程访问 相反 我们向组件发送请求并在单一线程中执行请求 本文讨论线程和Swing组件 目的不仅是为了帮助你以线程安全的方式使用SwingAPI 而且解释了我们为什么会选择现在这样的线程方案 本文包括以下内容
  单线程规则 Swing线程在同一时刻仅能被一个线程所访问 一般来说 这个线程是事件派发线程 规则的例外 有些操作保证是线程安全的 事件分发 假如你需要从事件处理或绘制代码以外的地方访问UI 那么你可以使用SwingUtilities类的invokeLater要求在事件派发线程中执行某些代码 这个方法会立即返回 不会等待代码执行完毕 invokeAndWait行为与invokeLater类似 除了这个方法会等待代码执行完毕 一般地 你可以用invokeLater来代替这个方法 下面是一些使用这几个API的例子 请同时参阅《TheJavaTutorial》中的 BINGOexample 尤其是以下几个类 CardWindow ControlPane Player和OverallStatusPane
  使用invokeLater方法你可以从任何线程调用invokeLater方法以请求事件派发线程运行特定代码 你必须把要运行的代码放到一个Runnable对象的run方法中 并将此Runnable对象设为invokeLater的参数 invokeLater方法会立即返回 不等待事件派发线程执行指定代码 这是一个使用invokeLater方法的例子
    RunnabledoWorkRunnable=newRunnable   };
  SwingUtilities invokeLater;使用invokeAndWait方法invokeAndWait方法和invokeLater方法很相似 除了invokeAndWait方法会等事件派发线程执行了指定代码才返回 在可能的情况下 你应该尽量用invokeLater来代替invokeAndWait 假如你真的要使用invokeAndWait 请确保调用invokeAndWait的线程不会在调用期间持有任何其他线程可能需要的锁

  这是一个使用invokeAndWait的例子
    voidshowHelloThereDialogthrowsException   };   SwingUtilities invokeAndWait;   }
  类似地 假设一个线程需要对GUI的状态进行存取 比如文本域的内容 它的代码可能类似这样
    voidprintTextField   throwsException   };   SwingUtilities invokeAndWait;   System out println;}
  假如你能避免使用线程 最好这样做 线程可能难于使用 并使得程序的debug更困难 一般来说 对于严格意义下的GUI工作 线程是不必要的 比如对组件属性的更新 不管怎么说 有时候线程是必要的 下列情况是使用线程的一些典型情况 执行一项费时的任务而不必将事件派发线程锁定 例子包括执行大量计算的情况 会导致大量类被装载的情况 和为网络或磁盘I/O而阻塞的情况 重复地执行一项操作 通常在两次操作间间隔一个预定的时间周期 要等待来自客户的消息 你可以使用两个类来帮助你实现线程 SwingWorker 创建一个后台线程来执行费时的操作 Timer 创建一个线程来执行或多次执行某些代码 在两次执行间间隔用户定义的延迟 使用SwingWorker类SwingWorker类在SwingWorker java中实现 这个类并不包含在Java的任何发行版中 所以你必须单独下载它 SwingWorker类做了所有实现一个后台线程所需的肮脏工作 虽然许多程序都不需要后台线程 后台线程在执行费时的操作时仍然是很有用的 它能提高程序的性能观感
  SwingWorkersanexampleofusingSwingWorker 要使用SwingWorker类 你首先要实现它的一个子类 在子类中 你必须实现construct方法还包含你的长时间操作 当你实例化SwingWorker的子类时 SwingWorker创建一个线程但并不启动它 你要调用你的SwingWorker对象的start方法来启动线程 然后start方法会调用你的construct方法 当你需要construct方法返回的对象时 可以调用SwingWorker类的get方法 这是一个使用SwingWorker类的例子
     //在main方法中   finalSwingWorkerworker=newSwingWorker   };   worker start;      //在动作事件处理方法中   JOptionPane showMessageDialog)
  当程序的main方法调用start方法 SwingWorker启动一个新的线程来实例化ExpensiveDialogComponent main方法还构造了由一个窗口和一个按钮组成的GUI 当用户点击按钮 程序将阻塞 假如必要 阻塞到ExpensiveDialogComponent创建完成 然后程序显示一个包含ExpensiveDialogComponent的模式对话框 你可以在MyApplication java找到整个程序 使用Timer类Timer类通过一个ActionListener来执行或多次执行一项操作 你创建定时器的时候可以指定操作执行的频率 并且你可以指定定时器的动作事件的监听者 启动定时器后 动作监听者的actionPerformed方法会被调用来执行操作 定时器动作监听者定义的actionPerformed方法将在事件派发线程中调用 这意味着你不必在其中使用invokeLater方法 这是一个使用Timer类来实现动画循环的例子
    publicclassAnimatorApplicationTimer   extendsJFrameimplementsActionListener   publicvoidstartAnimationelse   }   publicvoidstopAnimation   publicvoidactionPerformed      }
  在一个线程中执行所有的用户界面代码有这样一些优点 组件开发者不必对线程编程有深入的理解 像ViewPoint和Trestle这类工具包中的所有组件都必须完全支持多线程访问 使得扩展非常困难 尤其对不精通线程编程的开发者来说 最近的一些工具包如SubArctic和IFC 都采用和Swing类似的设计 事件以可预知的次序派发 invokeLater排队的runnable对象从鼠标和键盘事件 定时器事件 绘制请求的同一个队列派发 在一些组件完全支持多线程访问的工具包中 组件的改变被变化无常的线程调度程序穿插到事件处理过程中 这使得全面测试变得困难甚至不可能 更低的代价 尝试小心锁住临界区的工具包要花费实足的时间和空间在锁的治理上 每当工具包中调用某个可能在客户代码中实现的方法时 工具包都要保存它的状态并释放所有锁 以便客户代码能在必要时获得锁 当控制权交回到工具包 工具包又必须重新抓住它的锁并恢复状态 所有应用程序都不得不负担这一代价 即使大多数应用程序并不需要对GUI的并发访问 这是的SubArcticJavaToolkit的对在工具包中支持多线程访问的问题的描述 我们的基本信条是 当设计和建造多线程应用程序 尤其是那些包括GUI组件的应用程序时 必须保证极端小心 线程的使用可能会很有欺骗性 在许多情况下 它们表现得能够极好的简化编成 使得设计 专注于单一任务的简单自治实体 成为可能 在一些情况下它们的确简化了设计和编码 然而 在几乎所有的情况下 它们都使得调试 测试和维护的困难大大增加甚至成为不可能 无论大多数程序员所受的练习 他们的经验和实践 还是我们用来帮助自己的工具 都不是能够用来对付非决定论的 例如 全面测试在bug依靠于时间时是几乎不可能的 尤其对于Java来说 一个程序要运行在许多不同类型的机器的操作系统平台上 并且每个程序都必须在抢先和非抢先式调度下都能正常工作 由于这些固有的困难 我们力劝你三思是否绝对有使用线程的必要 尽管如此 有些情况下使用线程是必要的 所以subArctic提供了一个线程安全的访问机制
lishixinzhi/Article/program/Java/gj/201311/27616

Java Swing 中三种事件处理方法之比较

   Swing是目前Java中不可缺少的窗口工具组 是用户建立图形化用户界面(GUI)程序的强大工具 Java Swing组件自动产生各种事件来响应用户行为 如当用户点击按钮或选择菜单项目时 Swing组件会产生一个ActionEvent Swing组件会产生许多事件 如ActionEvents ChangeEvents ItemEvents等 来响应用户的鼠标点击行为 列表框中值的改变 计时器的开始计时等行为 在Java Swing编程中 通过注册监听器 我们可以监听事件源产生的事件 从而在事件处理程序中处理我们所需要处理的用户行为   Java Swing中处理各组件事件的一般步骤是      . 新建一个组件(如JButton)      . 将该组件添加到相应的面板(如JPanel)      . 注册监听器以监听事件源产生的事件(如通过ActionListener来响应用户点击按钮)      . 定义处理事件的方法(如在ActionListener中的actionPerformed中定义相应方法)     以上步骤我们可以用多种方法实现 但人们通常用二种方法 第一种方法是只利用一个监听器以及多个if语句来决定是哪个组件产生的事件 第二种方法是使用多个内部类来响应不同组件产生的各种事件 其具体实现又分两种方式 一种是匿名内部类 一种是一般内部类     为了说明如何使用上述三种方法实现事件的处理方法 我们建立一个简单的应用程序 该程序界面有两个按钮 当用户点击相应的按钮 就会弹出一个对话框显示相应的内容 通过这个简单程序 你可以实现自己更多 更复杂的用户界面程序     首先 我们利用单个监听器来实现该程序 我们定义一个名为Simple 的类来包括所有代码 所有的用户行为(如点击按钮)由一个监听器SimpleListenner中的actionPerformed方法来处理 以下是代码       /*   * Simple java 处理事件的第一种方法   * 在这个例子中 利用一个ActionListener来监听事件源产生的事件   * 用一些if语句来决定是哪个事件源   */       import java awt *;   import java awt event *;   import javax swing *;     public class Simple   {   private static JFrame frame; // 定义为静态变量以便main使用   private static JPanel myPanel; // 该面板用来放置按钮组件   private JButton button ; // 这里定义按钮组件   private JButton button ; // 以便让ActionListener使用     public Simple () // 构造器 建立图形界面   {   // 新建面板   myPanel = new JPanel();   // 新建按钮   button = new JButton( 按钮 ); // 新建按钮   button = new JButton( 按钮 );     SimpleListener ourListener = new SimpleListener();   // 建立一个actionlistener让两个按钮共享   button addActionListener(ourListener);   button addActionListener(ourListener);     myPanel add(button ); // 添加按钮到面板   myPanel add(button );   }     private class SimpleListener implements ActionListener   {   /*   * 利用该内部类来监听所有事件源产生的事件   * 便于处理事件代码模块化   */   public void actionPerformed(ActionEvent e)   {   // 利用getActionCommand获得按钮名称   // 也可以利用getSource()来实现   // if (e getSource() ==button )     String buttonName = e getActionCommand();   if (buttonName equals( 按钮 ))   JOptionPane showMessageDialog(frame    按钮 被点击 );   else if (buttonName equals( 按钮 ))   JOptionPane showMessageDialog(frame    按钮 被点击 );   else   JOptionPane showMessageDialog(frame    Unknown event );   }   }     public static void main(String s[])   {   Simple gui = new Simple (); // 新建Simple 组件     frame = new JFrame( Simple ); // 新建JFrame   // 处理关闭事件的通常方法   frame addWindowListener(new WindowAdapter() {   public void windowClosing(WindowEvent e)   {System exit( );} });     frame getContentPane() add(myPanel);   frame pack();   frame setVisible(true);   }   }     让我们来看看以上代码是如何工作的 在main方法中 我们定义了一个JFrame 然后将面板Jpanel添加到窗体中 该面板包括两个按钮 相应的变量Frame button button 定义在程序的开头部分     在程序入口main方法中 首先新建Simple 组件 通过构造器建立用户GUI 定义一个面板Jpanle 增加两个按钮 然后利用JButton addActionListerner将两个按钮加入到一个活动监听器SimpleLister中 最后 两个按钮添加到面板 当GUI建立后 我们将面板添加到窗体并显示结果 当用户点击按钮时 程序调用actionPerformed方法 通过if语句来判断是哪一个按钮被点击 然后在对话框中显示相应的内容     利用一个监听器来处理事件的缺点是 当程序比较复杂时 需要一大串的if 语句来实现 程序代码较难阅读与维护 当然 如果处理的事件较少 这种方式比较简单     通过使用匿名内部类可以解决上述存在的问题 使用简单的匿名内部类作为addActionListener的变量即可 以下是实现代码       /*   * Simple java 处理事件的第二种方法   * 在这个例子中 利用匿名内部类来监听每一个事件源产生的事件   * 避免使用一些if语句来决定是哪个事件源   */     import java awt *;   import java awt event *;   import javax swing *;     public class Simple   {   private static JFrame frame; // 定义为静态变量以便main使用   private static JPanel myPanel; // 该面板用来放置按钮组件   private JButton button ; // 这里定义按钮组件   private JButton button ; // 以便让ActionListener使用     public Simple () // 构造器 建立图形界面   {   // 新建面板   myPanel = new JPanel();   // 新建按钮   button = new JButton( 按钮 ); // 新建按钮   button = new JButton( 按钮 );     // 每一个事件源需要一个监听器   // 定义一个匿名内部类来监听事件源产生的事件   button addActionListener(   new ActionListener()   {   public void actionPerformed(ActionEvent e)   {   JOptionPane showMessageDialog(frame    按钮 被点击 );   }   }   );     button addActionListener(   new ActionListener()   {   public void actionPerformed(ActionEvent e)   {   JOptionPane showMessageDialog(frame    按钮 被点击 );   }   }   );     myPanel add(button ); // 添加按钮到面板   myPanel add(button );   }     public static void main(String s[])   {   Simple gui = new Simple (); // 新建Simple 组件     frame = new JFrame( Simple ); // 新建JFrame   // 处理关闭事件的通常方法   frame addWindowListener(new WindowAdapter() {   public void windowClosing(WindowEvent e)   {System exit( );} });   frame getContentPane() add(myPanel);   frame pack();   frame setVisible(true);   }   }     使用匿名内部类同样存在许多另外的问题 首先 根据组件在代码中被定义的不同位置 类的定义以及处理事件的代码将分散在程序的各个部分 不是集中在一块 同样不便于阅读与维护 各事件的处理全部由嵌套的程序块组成 视觉上很难定位程序代码 如果事件处理程序比较复杂 内部类中的代码将变得很长 你将找不到相应的组件定义位置 最后 当工具栏 菜单栏目等需要处理同样的用户行为时 该方法将使代码更难维护     我们使用一般的命名内部类可以解决以上许多问题 所有的事件处理方法都集中在一块 并且都具有有意义的名称 程序非常容易阅读与维护 单个的事件处理程序也可以被工具栏 菜单栏等重复使用     以下是实现代码       /*   * Simple java 处理事件的第三种方法   * For this example we will use inner member classes to   * 在这个例子中 利用一般内部类来监听每个事件源产生的事件   * 该方法避免了第二种方法中由于使用匿名内部类而导致的代码混乱   * 便于集中处理事件代码   * 每一个Hander可以被工具栏或菜单多次使用   */   import java awt *;   import java awt event *;   import javax swing *;     public class Simple   {   private static JFrame frame; // 定义为静态变量以便main使用   private static JPanel myPanel; // 该面板用来放置按钮组件   private JButton button ; // 这里定义按钮组件   p lishixinzhi/Article/program/Java/hx/201311/26824

阅读更多 >>>  数组公式的快捷键,关于EXCEL的数组公式的输入

Java Swing也惊艳之二:环环相套

   一 序言
  关于 Java做不好桌面 的争论已经由来已久 虽然Swing和Java D已经有超过十年的历史 也有JIDE JGoodies aver等不少开源Swing组件 但是用Java做桌面程序仍然不是一件轻松的事 本《Java也惊艳》系列文章 就是想通过一些简单生动的例子 和大家一起认识Java 探索Swing 其实你只需要多一点创意 多一点耐心 你的Java程序也可以 惊艳 !本文就带您一起进入Java的惊艳之旅
   二 立体套管效果
  在网络通讯中 经常要表达协议之间的 承载 关系 例如 IP协议作为高层协议可以承载在SDH上 也可以承载在ATM协议上 同样 IP作为协议还可以承载更多的高层协议 例如Voice over IP 甚至电信中Everything over IP的概念 在表现上 用相互嵌套的立体套管来表现协议的 承载 是再合适不过了(如下图)
  

  具体实现很简单 主要代码如下
   import java awt *; import java awt geom *; import javax swing *; import aver *; public class PipleComponent extends JComponent { public void paint(Graphics g) { Graphics D g d = (Graphics D) g; g d setRenderingHint(RenderingHints KEY_ANTIALIASING RenderingHints VALUE_ANTIALIAS_ON); Shape parentHollowShape=createPiple(g d averUtil getRandomColor() null); createPiple(g d averUtil getRandomColor() parentHollowShape); createPiple(g d averUtil getRandomColor() parentHollowShape); createPiple(g d averUtil getRandomColor() parentHollowShape); createPiple(g d averUtil getRandomColor() parentHollowShape); } private Shape createPiple(Graphics D g d int x int y int width int height Color color Shape parentHollowShape) { if(parentHollowShape!=null){ Rectangle bounds=parentHollowShape getBounds(); Rectangle rightClip=new Rectangle(bounds x+bounds width/ bounds y bounds height); Area clip=new Area(parentHollowShape); clip add(new Area(rightClip)); g d setClip(clip); } int circleWidth = height/ ; GradientPaint paint = new GradientPaint(x y color brighter() x y + (int) (height * ) color darker() true); g d setPaint(paint); Ellipse D Double leftCircle = new Ellipse D Double(x circleWidth / y circleWidth height); Ellipse D Double rightCircle = new Ellipse D Double(x + width circleWidth / y circleWidth height); int thickness= ; Ellipse D Double rightHollowCircle = new Ellipse D Double(rightCircle getX()+thickness rightCircle getY()+thickness rightCircle getWidth() thickness* rightCircle getHeight() thickness* ); Rectangle rect = new Rectangle(x y width height); Area area = new Area(leftCircle); area add(new Area(rect)); area subtract(new Area(rightCircle)); g d fill(area); g d setColor(color darker()); g d fill(rightCircle); paint = new GradientPaint(x y Color darkGray x y + (int) (height * ) Color lightGray true); g d setPaint(paint); g d fill(rightHollowCircle); g d setClip(null); return rightHollowCircle; } public static void main(String[] args) { JFrame frame = new JFrame(); frame setDefaultCloseOperation(JFrame EXIT_ON_CLOSE); frame setSize( ); frame add(new PipleComponent()); frame setVisible(true); } }
  
   三 总结
  本文知识要点
  渐变填充 创建GradientPaint并设置 亮 暗 亮 的填充模式
  使用Clip 类似蒙版/剪切的Java D技术 看看Graphics的setClip函数即可
  Area的使用 主要是Area的相交 合并等几个常见图形处理手法 详细请看java awt geom Area类
  使用随机色 这个就太简单了 如果有aver jar 可以直接使用averUtil getRandomColor() 如果没有 就直接new Color就行了 注意使用第四个int参数增加Alpha透明度的变化
  如果大家感兴趣 可以尝试用上述Java D技巧实现下图效果
  

阅读更多 >>>  电脑声卡在哪

Java Swing APIs可插拔式外观风格特性应用

  Java Swing 应用编程接口提供了可插拔式外观风格(PLAF)的特性 它允许Swing 图形用户接口(GUI)小应用根据编程人员定制的外观风格设置来改变界面外观风格
  几乎所有现代用户接口框架都结合了视图和控制 无论它们是基于SmallTalk C++或Java
  Swing将每个组件的视图和控制封装到一个称为UI委托的对象中
  因此 Swing的体系结构被称为模型委托结构而不是模式 视图 控制器结构 理想情况下 模型和UI委托直接的通讯是间接的 允许多个模型与一个UI委托相连 反之亦然
   UI委托

  每个UI委托源自一个名为ComponentUI的抽象类 ComponentUI的方法描述了一个UI委托和使用它的组件之间进行通讯的基本原理
  注意的是每个方法都将JComponent作为一个参数 ComponentUI有很多方法 这里只给出几个最重要的
   ·static ComponentUI createUI(JComponent c) 该方法通常用来返回UI委托的一个共享实例 该UI委托通过定义ComponentUI子类本身而定义 这个共享实例用于相同类型的组件之间的共享(例如 所有使用金属外观的JButtons共享同样的静态UI委托实例 默认情况下 该委托实例在tal MetalButtonUI中定义
   ·InstallUI(JComponent c) 该方法在特定的组件上安装ComponentUI 通常会给组件和它的模型添加一个监听器 当状态发生改变时来通知UI委托进行视图的更新
   ·Update (Graphics g JComponent c) 如果组件是不透明的 那么应该描绘它的背景并调用paint(Graphics g JComponent C)方法
   ·Paint (Graphics g JComponent c): 为了能够正确地描绘 该方法要从组件收集所有需要的信息以及可能的模型
  为了增强特定UI委托的使用 我们可以调用一个组件的setUI()方法 如下所示
   JButton m_button = new JButton();m_button setUI((MyButtonUI)MyButtonUI createUI(m_button));
  JComponent类中定义了用于分配UI委托的方法 因为方法声明中不包含特定组件代码 然而 对数据模型而言这是不可能的 因为不存在所有模型可以追溯到的基接口(例如 不存在像Swing模型中的ComponentUI此类的基类) 为此 分配模型的方法在JComponent的子类中定义
   使用PLAF
  Swing包含几个UI委托集 每个集合中包含了用于大部分Swing组件的ComponentUI实现 且每个这样的集合称为一个PLAF实现
  javax swing plaf包有继承自ComponentUI的抽象类组成 javax swing plaf basic包中的类扩展了这些抽象类用来实现基本的外观 UI委托集合是所有其它外观类用作构建自己的外观的基类 基本外观不能自己使用因为BasicLookAndFeel是一个抽象类 有三个继承自BasicLookAndFeel的可插拔式外观实现
   ·Windows: sun java swing plaf windows WindowsLookAndFeel
   ·CDEMotif: sun java swing plaf motif MotifLookAndFeel
   ·Metal (default): tal MetalLookAndFeel
  同时还有一个模仿苹果用户接口的MacLookAndFeel 但是没有包含在Java 中 必须单独下载 多路外观javax swing plaf multi MultiLookAndFeel扩展了javax swing plaf中的所有抽象类 它运行同时使用多种外观的组合 且有意但并不仅限于和访问外观一起使用 每个多路UI委托的任务是管理每个它们的子UI委托
  每个外观包中都包含了一个继承自抽象类javax swing LookAndFeel BasicLookAndFeel MetalLookAndFeel WindowsLookAndFeel等的类 这是访问每个外观包的中心点 当改变当前外观时 你会用到它们 同时UIManager类(用于管理安装的外观)使用它们来访问当前外观UIDefaults表(其中包含了用于每个Swing组件相应外观的UI委托类名称)
  要想改变应用的当前外观 你只需要简单调用UIManager的setLookAndFeel()方法 并将要使用的外观全名传递给该方法即可 可以使用列表A中的代码在运行时完成该任务
列表A try {   UIManager setLookAndFeel(     sun java swing plaf motif MotifLookAndFeel );   SwingUtilities updateComponentTreeUI(myJFrame); } catch (Exception e) { System err println( Could not load LookAndFeel ); }   当外观改变时 Swing实用工具updateComponentTreeUI()通知所有特定组件的孩子 并通知它们丢弃原来的UI委托用来换取一个不同的特定类型委托
  图A B和C演示了金属 图形和窗口外观之间的不同之处
  
  图A
  
  图B
  
  图C
   创建一个PLAF
  在创建一个PLAF之前 你必须在Java中创建外观的两种设计方法中做出决定 其中一种方法是通过扩展javax swing plaf包来创建外观 另一种方法是通过扩展已经存在的外观包 通常是javax swing plaf basic来实现
  如果要创建一个用于PC的外观 我们不推荐使用扩展来自javax swing plaf包中的外观的方法 这是因为javax swing basic包中已经扩展了几乎整个的javax swing plaf包供我们使用 这样我们可以通过挑选外观需要的东西来进行定制而不需要扩展和实现任何东西
  javax swing plaf包的实现遵循的一个基本原则是使得定制一个外观尽可能的简单 这个原则是LookAndFeel类中组件 颜色和UI类的中心
  javax swing plaf basic包以我们希望的方式描绘轻量级Swing组件 如果你是为一台设备而不是计算机屏幕创建一个外观 那么最好的方法是从零开始扩展javax swing plaf包
lishixinzhi/Article/program/Java/hx/201311/26367

java Swing 编写需要用的一些常用组件,求代码~~

package zhidao;import javax.accessibility.Accessible;import javax.swing.Action;import javax.swing.DefaultButtonModel;import javax.swing.Icon;import javax.swing.JButton;import javax.swing.JRootPane;import javax.swing.SwingUtilities;import javax.swing.UIManager;import javax.swing.plaf.ButtonUI;public class MyButton extends JButton implements Accessible{ private static final long serialVersionUID = 1L; private static final String uiClassID = "MyButtonUI"; public MyButton () { this (null, null); } public MyButton ( Icon icon ) { this (null, icon); } public MyButton ( String text ) { this (text, null); } /** * Creates a button where properties are taken from the Action * supplied. * * @param a * the Action used to specify the new button * @since 1.3 */ public MyButton ( Action a ) { this (); setAction (a); } public MyButton ( String text, Icon icon ) { setModel (new DefaultButtonModel ()); init (text, icon); } public void updateUI () { setUI ((ButtonUI) UIManager.getUI (this)); } public String getUIClassID () { return uiClassID; } public boolean isDefaultButton () { JRootPane root = SwingUtilities.getRootPane (this); if (root != null) { return root.getDefaultButton () == this; } return false; } public void removeNotify () { JRootPane root = SwingUtilities.getRootPane (this); if (root != null && root.getDefaultButton () == this) { root.setDefaultButton (null); } super.removeNotify (); }}
Java GUI编程似乎不是重点
自定义组建?什么需要还要自定义?
这个看你设计成什么样子,都有不同的需求,代码只能参考一下。
package com.hengjun.hjropcs.commons;
import java.awt.Dimension;
import java.awt.Font;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.swing.ComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JTextField;
import javax.swing.UIManager;
import com.hengjun.commons.lang.Func1;
import com.hengjun.commons.lang.HJCollectionUtils;
import com.hengjun.commons.swing.DimensionUtility;
import com.hengjun.commons.swing.HJComboBoxUtils;
import com.hengjun.commons.swing.combobox.decorators.SpellComboBoxDecorator;
import com.hengjun.commons.ui.DisplayData;
import com.hengjun.framework.enums.EDataStatus;
import com.hengjun.framework.framework_core.model.BaseModel;
import com.hengjun.framework.framework_core.support.constant.MessageConstants;
import com.hengjun.hjrop.model.dbmodel.RopRegion;
import com.hengjun.hjrop.model.dbmodel.RopStation;
import com.hengjun.hjropcs.cache.CacheRegion;
import com.hengjun.hjropcs.commons.hjcombobox.Builder;
import com.hengjun.hjropcs.commons.hjcombobox.RegionComboBox.CBuilder;
import com.hengjun.hjropcs.core.ui.FullSizeComboBoxUI;
public class HJCommonCombox extends JComboBox{

//批量修改用,=1 带拼音搜索,批量修改时第一项插入一个new 对象,而不是CommonObject中的对象;
//因为点击+-号时可以直接更改index=0项的text即可,效率高
public final static int MULTI_MODIFY_WITH_SPELL=1;
//批量修改用,=2 不带拼音搜索
public final static int MULTI_MODIFY_WITHOUT_SPELL=2;

//active数据,不带有第一行的empty
public final static int ACTIVE_RECORDS_WITH_SPELL_WITHOUT_EMPTY=3;

//默认的下拉框长度
// public static final int COMBOBOX_MAX_WIDTH = 170;
private boolean isSupportSpell=false;
//产生一个新的数据model,第一条数据为new DisplayData(null,"","")
protected List produceNewModelData(List activeViewForMulti){
if(activeViewForMulti==null || activeViewForMulti.size()==0){
return activeViewForMulti;
}
List ret=new ArrayList(activeViewForMulti);
ret.set(0, new DisplayData(null,"",""));
return ret;

}
public boolean isSupportSpell() {
return isSupportSpell;
}

public void setSRTDimension(){
this.setMaximumSize(DimensionUtility.SRTDimension);
this.setMinimumSize(DimensionUtility.SRTDimension);
}
public void setSRTDimension(Dimension dimension){
this.setMaximumSize(dimension);
this.setMinimumSize(dimension);
}
public void setSupportSpell(boolean isSupportSpell) {
this.isSupportSpell = isSupportSpell;
}
/**
* 默认创建的是含有所有active数据的下拉框
*/
public HJCommonCombox(){
this.setMaximumSize(DimensionUtility.componentDimension);
this.setMinimumSize(DimensionUtility.componentDimension);
}
public HJCommonCombox(Builder builder){
//默认是allActive数据
List model=getActiveModelData();
//如果是批量修改用,基于active数据
if(builder.isMultiModify()){
model=getActiveMultiModelData();
model= produceNewModelData(model);
}
//如果需要所有数据
if(builder.isAll()){
model=getAllModelData();//getActiveModelData;
}
//如果不需要第一项empty值
if(!builder.isWithEmpty()){
HJComboBoxUtils.showList(this, model,1);
}
if(builder.isWithEmpty()){
HJComboBoxUtils.showList(this, model);
}
//如果需要拼音搜索
if(builder.isSupportSpell()){
SpellComboBoxDecorator scb = new SpellComboBoxDecorator(this);
scb.initialize();
}
this.setMaximumSize(DimensionUtility.componentDimension);
this.setMinimumSize(DimensionUtility.componentDimension);
}
//根据filter名称和builder,返回List
public List

阅读更多 >>>  贴片灯泡组装机怎么拆

getListData(String filter,Builder builder){

List model=getFilterActiveModelData(filter);

//如果是批量修改用,基于active数据

if(builder.isMultiModify()){

model=getFilterActiveMultiModelData(filter);

model= produceNewModelData(model);

}

//如果需要所有数据

if(builder.isAll()){

model=getFilterAllModelData(filter);//getActiveModelData;

}

//如果不需要第一项empty值

if(!builder.isWithEmpty()){

if (!HJCollectionUtils.isEmpty(model)){

model=model.subList(1,model.size());

}

}else{//需要则直接返回

// HJComboBoxUtils.showList(this, model);

}

return model;

}

public HJCommonCombox(String filter,Builder builder){

//默认是allActive数据

List model=getFilterActiveModelData(filter);

//如果是批量修改用,基于active数据

if(builder.isMultiModify()){

model=getFilterActiveMultiModelData(filter);

model= produceNewModelData(model);

}

//如果需要所有数据

if(builder.isAll()){

model=getFilterAllModelData(filter);//getActiveModelData;

}

//如果不需要第一项empty值

if(!builder.isWithEmpty()){

HJComboBoxUtils.showList(this, model,1);

}else{

HJComboBoxUtils.showList(this, model);

}

//如果需要拼音搜索

if(builder.isSupportSpell()){

SpellComboBoxDecorator scb = new SpellComboBoxDecorator(this);

scb.initialize();

}

this.setMaximumSize(DimensionUtility.componentDimension);

this.setMinimumSize(DimensionUtility.componentDimension);

}

/**

* 当内容比较长的时候,做得处理

*/

public void updateUI() {

setUI(new FullSizeComboBoxUI());

}

/**

* @param isSupportSpell is true;表示支持拼音搜索

*/

public HJCommonCombox(boolean isSupportSpell){

this();

if(isSupportSpell){

this.isSupportSpell=isSupportSpell;

SpellComboBoxDecorator scb = new SpellComboBoxDecorator(this);

scb.initialize();

}

}

/**@deprecated 请使用 HJCommonCombox(Builder builder)模式

* @param isSupportSpell is true;表示支持拼音搜索

*/

public HJCommonCombox(boolean isSupportSpell,boolean isAll){

this(isSupportSpell);

}

public void setSelectedItem(Object o){

ComboBoxModel cm=getModel();

HJComboBoxUtils.setSelectedItem(o, cm);

}

/**

* 全部置空,在批量修改中使用

*/

public static void allSetEmpty(HJCommonCombox cmbBox){

if(cmbBox.getModel().getSize()>0){

cmbBox.setSelectedIndex(0);

cmbBox.setEnabled(false);

DisplayData dd=(DisplayData) cmbBox.getItemAt(0);

dd.setText(MessageConstants.ALL_SET_EMPTY);

JTextField editor = (JTextField)cmbBox.getEditor().getEditorComponent();

editor.setText(MessageConstants.ALL_SET_EMPTY);

}

}

public void setSelectedIndex(int anIndex) {

if(getModel().getSize()>0){

super.setSelectedIndex(anIndex);

}

}

/**

* 全部置空复位

* @param cmbBox

*/

public static void allSetEmptyReset(HJCommonCombox cmbBox){

if(cmbBox.getModel().getSize()>0){

cmbBox.setSelectedIndex(0);

cmbBox.setEnabled(true);

DisplayData dd=(DisplayData) cmbBox.getItemAt(0);

dd.setText("");

// cmbBox.rep

JTextField editor = (JTextField)cmbBox.getEditor().getEditorComponent();

editor.setText("");

}

}

/**

*

* @param collection

* @param converter

* @param allRecods 返回所有的对象

* @param allActiveRecords 返回所有状态为active的对象

* @return 不需要返回值,修改传入的2个list即可

*/

public static

void select(Collection

collection, Func1

converter,List allRecods,List allActiveRecords) {

BaseModel temp=null;

for (T t : collection) {

temp=(BaseModel)t;

if(temp!=null){

if(EDataStatus.VALID.getKey()==temp.getDataStatus()){

allActiveRecords.add(converter.func(t));

}

allRecods.add(converter.func(t));

}

}

}

public static

void select(Collection

collection, Func1

converter,List inputRecods) {

BaseModel temp=null;

for (T t : collection) {

temp=(BaseModel)t;

if(temp!=null){

inputRecods.add(converter.func(t));

}

}

}

public static

void select(Collection

collection, Func1

converter,List allRecods,List allActiveRecords,List allActiveRecordsWithMulti) {

BaseModel temp=null;

Object a=null;

for (T t : collection) {

temp=(BaseModel)t;

if(temp!=null){

a=converter.func(t);

if(EDataStatus.VALID.getKey()==temp.getDataStatus()){

allActiveRecords.add(a);

allActiveRecordsWithMulti.add(a);

}

allRecods.add(a);

}

}

}

protected List

getActiveModelData(){

return null;

}

protected List

getAllModelData(){

return null;

}

protected List

getActiveMultiModelData(){

return null;

}

protected List

getFilterActiveModelData(String filter){

return null;

}

protected List

getFilterAllModelData(String filter){

return null;

}

protected List

getFilterActiveMultiModelData(String filter){

return null;

}

}

关于Java Swing 图形界面的?

0. JavaSwing 简介
Java Swing 图形界面开发简介
1. JavaSwing 布局管理器
JavaSwing_1.1: FlowLayout(流式布局)
JavaSwing_1.2: GridLayout(网格布局)
JavaSwing_1.3: GridBagLayout(网格袋布局)
JavaSwing_1.4: BoxLayout(箱式布局)
JavaSwing_1.5: GroupLayout(分组布局)
JavaSwing_1.6: CardLayout(卡片布局)
JavaSwing_1.7: BorderLayout(边界布局)
JavaSwing_1.8: SpringLayout(弹性布局)
JavaSwing_1.9: null(绝对布局)
2. JavaSwing 基本组件
JavaSwing_2.1: JLabel(标签)
JavaSwing_2.2: JButton(按钮)
JavaSwing_2.3: JRadioButton(单选按钮)
JavaSwing_2.4: JCheckBox(复选框)
JavaSwing_2.5: JToggleButton(开关按钮)
JavaSwing_2.6: JTextField(文本框)
JavaSwing_2.7: JPasswordField(密码框)
JavaSwing_2.8: JTextArea(文本区域)
JavaSwing_2.9: JComboBox(下拉列表框)
JavaSwing_2.10: JList(列表框)
JavaSwing_2.11: JProgressBar(进度条)
JavaSwing_2.12: JSlider(滑块)
3. JavaSwing 面板组件
JavaSwing_3.1: JPanel(面板)
JavaSwing_3.2: JScrollPane(滚动面板)
JavaSwing_3.3: JSplitPane(分隔面板)
JavaSwing_3.4: JTabbedPane(选项卡面板)
JavaSwing_3.5: JLayeredPane(层级面板)
4. JavaSwing 其他组件
JavaSwing_4.1: JFrame(窗口)
JavaSwing_4.2: JDialog、JOptionPane(对话框)
JavaSwing_4.3: JFileChooser(文件选择器)
JavaSwing_4.4: JColorChooser(颜色选择器)
JavaSwing_4.5: JMenuBar(菜单栏)
JavaSwing_4.6: JToolBar(工具栏)
JavaSwing_4.7: JPopupMenu(弹出菜单)
JavaSwing_4.8: JTable(表格)
JavaSwing_4.9: JTree(树)
JavaSwing_4.10: JInternalFrame(内部窗口)
5. JavaSwing 相关特性
JavaSwing_5.1: 组件的位置和尺寸
JavaSwing_5.2: 组件边框(Border)
JavaSwing_5.3: 事件处理
JavaSwing_5.4: 多线程并发与线程安全
JavaSwing_5.5: 拖拽功能
JavaSwing_5.6: 系统托盘(System Tray)
JavaSwing_5.7: 闪屏(Splash Screen)
扩展:Java AWT/Swing 其他相关
Java绘图: 使用Graphics类绘制线段、矩形、椭圆/圆弧/扇形、图片、文本
Java图片操作 — 图片的读取、绘制、缩放、裁剪、保存
Java代码截屏:使用 Java 代码截取电脑屏幕并保存
Java模拟鼠标键盘输入事件 — Robot 类
Java操作桌面应用 — Desktop 类
Java操作系统剪贴板(Clipboard)实现复制和粘贴

java的Swing是轻量级组件,轻量级组件是什么意思?

即全部是用java语言编写的,这可以最大限度地做到,在所有平台上的工作方式都相同。
一、轻量级组件是用java代码画出来的,这样具有平台移植性
重量级组件是调用系统的函数画出来的组件,比如主窗体
一般来说尽量用轻量级的组件,这样对程序的移植性很好。
一般java.swing包里的组件大部分是轻量级的,java.awt里面的是重量级的。
swing是由100%纯java实现的,swing组件是用java实现的轻量级组件,没有本地代码
不依赖操作系统的支持,这是与AWT组件的最大组别。由于AWT组件通过与具体平台的
对等类(peer)实现,因此Swing比AWT组件具有更强的实用性。Swing在不同的
平台上表现一致,并且有能力提供本地窗口系统不支持的其它特性。
二、总的来说就是
重量级组件:对应运行平台必须存在一个对应的组件.
轻量级组件:在一个虚拟的画布上画出来的组件(所以swing较慢),所有轻量级组件"最终"要放到重量级组件(jframe,jdialog)中.由于是画出来所以能做到各种平台上一致的表现.同样,如果混合重量级组件和轻量级组件容易引起重叠上的冲突.

java的swing组件的使用

这些直接看对应JDK版本的java doc里面关于swing的部分,有很详细的索引页和每种控件的使用方法,还有jdk自己的一些sample。
这个oracle网站有教程
Swing是用于图形用户界面开发的一个全面解决方案,包括250多个类,在这里不能一一列出。本书仅使用Swing用户界面。
1.标 签 2.按 钮 3.文本域 4.文本区 5.列表框 6.组合框
7.复选框 8.单选按钮 9.滚动条 10.选项卡 11.对话框 12.菜 单
1.标 签
标签类JLabel是用于显示文字或图标的简单组件。JLabel的构造方法包括:
public JLabel()
public JLabel(Icon icon)
public JLabel(Icon icon, int horizontalAlignment)
public JLabel(String text)
public JLabel(String text, Icon icon, int horizontalAlignment)
public JLabel(String text, int horizontalAlignment)
在构造方法中,text指定标签的文字,icon指定标签的图标,horizontalAlignment指定文本或图标的水平对齐方式。
JLabel实例维护的属性包括:
表8.3 JLabel的属性 属性名
数据类型
访问
缺省值
disabledIcon
Icon
SG
灰色过滤图标
displayedMnemonic
Int
SG
——
horizontalAlignment
Int
CSG
LEFT
horizontalTextPosition
Int
SG
RIGHT
Icon
Icon
CSG
null
iconTextGap
Int
SG
4个像素
labelFor
Component
SG
null
Text
String
CSG
“”
verticalAlignment
Int
SG
CENTER
verticalTextPosition
int
SG
CENTER
注:在访问中,C=可在构造时设置/G=获取方法/S=设置方法
disabledIcon:标签被禁用时显示的图标。
displayedMnemonic:设置LabelFor属性后显示的助记符。
horizontalAlignment:标签内容的水平对齐方式。取值包括:SwingConstants.LEFT、SwingConstants.RIGHT和SwingConstants.CENTER。
horizontalTextPosition:文本相对于图标的水平位置;与水平对齐方式的有效值相同。
icon:标签在启用时显示的图标。
iconTextGap:标签的文本与图标之间的间隙,以像素点为单位。
labelFor:一个组件,它在标签的助记符被键入时获得焦点。
Text:标签显示的文本。
verticalAlignment:标签内容的垂直对齐方式。取值包括:SwingConstants.TOP、SwingConstants.BOTTOM和SwingConstants.CENTER。

网站数据信息

"java swing组件,JAVA SWING中如何清除JPanel中的组件?"浏览人数已经达到19次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:java swing组件,JAVA SWING中如何清除JPanel中的组件?的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!