- 浏览: 194488 次
- 性别:
- 来自: 厦门
文章分类
最新评论
-
行者买刀:
qxpidt 写道楼主,我想问下,嵌套这些WEB应用后,如何操 ...
JDIC一个能够用java调用ie内核的包 -
qxpidt:
楼主,我想问下,嵌套这些WEB应用后,如何操作你登录的COOK ...
JDIC一个能够用java调用ie内核的包 -
lookforwarding:
...
java重写JSplitPane的UI,设置分隔条的颜色 -
v韧竹v:
最后那个抽象工厂模式,CarType是不是定义错了,应该abs ...
设计模式之略见一斑(工厂模式Factory) -
l7810:
这与模板模式有什么区别啊?
设计模式之略见一斑(建造模式builder)
通常我们改变一个SWING的外观有两种方法,一种是UIManager.put("","");就可以了.但是这里的主键必须是已经有的.如:
UIManager.put("ProgressBarUI","com.test.MyProgressBarUI");
另一种是设置ComponentUI,
如:
JProgressBar jpb;
jpb.setUI(new MyProgressBarUI());
即可
下面我们来改写一下JSplitPane的UI.当我们调用setUI时提示的类是"SplitPaneUI",这个类是个抽象类,我们查看它的子类,它有BasicSplitPaneUI, MultiSplitPaneUI ,前者是SplitPaneUI 的基本 L&F 实现,后者是用于组合 SplitPaneUI
的多路 UI.所以我们重写前者.我们查看这个类的源码.可以看到,它主要有两个JButton,和一个Divider.
所以重点重写下面三个函数.
public BasicSplitPaneDivider createDefaultDivider() {}
protected JButton createLeftOneTouchButton() {}
protected JButton createRightOneTouchButton() { }
重写成我们想要的效果就可以了.
下面是个人修改之后的效果
UI源码如下:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.lgh.mail.components; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Insets; import java.awt.LayoutManager; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JSplitPane; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicSplitPaneDivider; import javax.swing.plaf.basic.BasicSplitPaneUI; import sun.swing.DefaultLookup; /** * * @author lgh */ public class SearchSplitPaneUI extends BasicSplitPaneUI { private static final Color BG_COLOR = Color.BLACK; private static final SearchSplitPaneUI cornerButtonUI = new SearchSplitPaneUI(); public SearchSplitPaneUI() { super(); } public static ComponentUI createUI(JComponent c) { return new SearchSplitPaneUI(); } @Override public void paint(Graphics g, JComponent c) { super.paint(g, c); g.setColor(Color.BLACK); int width = c.getWidth(); int height = c.getHeight(); g.drawRect(3, 3, width - 6, height - 6); } /** * Creates the default divider. */ @Override public BasicSplitPaneDivider createDefaultDivider() { return new MyBasicSplitPaneDivider(this); } private class MyBasicSplitPaneDivider extends BasicSplitPaneDivider { private int oneTouchSize, oneTouchOffset; boolean centerOneTouchButtons; //center空白区域 private int x1, y1; @SuppressWarnings("unchecked") public MyBasicSplitPaneDivider(SearchSplitPaneUI ui) { super(ui); // oneTouchSize = DefaultLookup.getInt(ui.getSplitPane(), ui, // "SplitPane.oneTouchButtonSize", ONE_TOUCH_SIZE); // oneTouchOffset = DefaultLookup.getInt(ui.getSplitPane(), ui, // "SplitPane.oneTouchButtonOffset", ONE_TOUCH_OFFSET); // centerOneTouchButtons = DefaultLookup.getBoolean(ui.getSplitPane(), // ui, "SplitPane.centerOneTouchButtons", true); oneTouchSize = ONE_TOUCH_SIZE; oneTouchOffset = ONE_TOUCH_OFFSET; centerOneTouchButtons = true; setLayout(new DividerLayout()); setBasicSplitPaneUI(ui); orientation = splitPane.getOrientation(); setCursor((orientation == JSplitPane.HORIZONTAL_SPLIT) ? Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR) : Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR)); setBackground(UIManager.getColor("SplitPane.background")); // super(ui); // this.setBackground(BG_COLOR); // this.setPreferredSize(getSize()); } private void revalidate() { invalidate(); if (splitPane != null) { splitPane.revalidate(); } } /** * Creates and return an instance of JButton that can be used to * collapse the right component in the split pane. */ @Override protected JButton createRightOneTouchButton() { JButton b = new JButton() { public void setBorder(Border border) { } @Override public void paint(Graphics g) { if (splitPane != null) { int[] xs = new int[3]; int[] ys = new int[3]; int blockSize; // Fill the background first ... g.setColor(Color.WHITE); g.fillRect(0, 0, this.getWidth(), this.getHeight()); // ... then draw the arrow. if (orientation == JSplitPane.VERTICAL_SPLIT) { blockSize = Math.min(getHeight(), oneTouchSize); xs[0] = blockSize; xs[1] = blockSize << 1; xs[2] = 0; ys[0] = blockSize; ys[1] = ys[2] = 0; } else { blockSize = Math.min(getWidth(), oneTouchSize); xs[0] = xs[2] = 0; xs[1] = blockSize; ys[0] = 0; ys[1] = blockSize; ys[2] = blockSize << 1; } g.setColor(BG_COLOR); g.fillPolygon(xs, ys, 3); } } // Don't want the button to participate in focus traversable. public boolean isFocusTraversable() { return false; } }; b.setMinimumSize(new Dimension(oneTouchSize, oneTouchSize)); b.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); b.setFocusPainted(false); b.setBorderPainted(false); b.setRequestFocusEnabled(false); return b; } /** * Creates and return an instance of JButton that can be used to * collapse the left component in the split pane. */ protected JButton createLeftOneTouchButton() { JButton b = new JButton() { public void setBorder(Border b) { } public void paint(Graphics g) { if (splitPane != null) { int[] xs = new int[3]; int[] ys = new int[3]; int blockSize; // Fill the background first ... g.setColor(Color.WHITE); g.fillRect(0, 0, this.getWidth(), this.getHeight()); // ... then draw the arrow. g.setColor(BG_COLOR); if (orientation == JSplitPane.VERTICAL_SPLIT) { blockSize = Math.min(getHeight(), oneTouchSize); xs[0] = blockSize; xs[1] = 0; xs[2] = blockSize << 1; ys[0] = 0; ys[1] = ys[2] = blockSize; g.drawPolygon(xs, ys, 3); // Little trick to make the // arrows of equal size } else { blockSize = Math.min(getWidth(), oneTouchSize); xs[0] = xs[2] = blockSize; xs[1] = 0; ys[0] = 0; ys[1] = blockSize; ys[2] = blockSize << 1; } g.fillPolygon(xs, ys, 3); } } // Don't want the button to participate in focus traversable. public boolean isFocusTraversable() { return false; } }; b.setMinimumSize(new Dimension(oneTouchSize, oneTouchSize)); b.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); b.setFocusPainted(false); b.setBorderPainted(false); b.setRequestFocusEnabled(false); return b; } @Override public void paint(Graphics g) { super.paint(g); Dimension size = getSize(); g.setColor(BG_COLOR); g.fillRect(1, 1, size.width - 1, size.height - 1); g.setColor(Color.GRAY); g.drawRect(0, 0, size.width, size.height); g.setColor(Color.WHITE); //分为水平时跟垂直时,白色区域 if (orientation == JSplitPane.VERTICAL_SPLIT) { g.fillRect(x1, 1, 30, size.height - 1); } else { g.fillRect(1, y1, size.width - 1, 30); } if (leftButton != null) { leftButton.repaint(); } if (rightButton != null) { rightButton.repaint(); } } /** * Used to layout a <code>BasicSplitPaneDivider</code>. * Layout for the divider * involves appropriately moving the left/right buttons around. * <p> */ protected class DividerLayout implements LayoutManager { public void layoutContainer(Container c) { if (leftButton != null && rightButton != null) { if (splitPane.isOneTouchExpandable()) { Insets insets = getInsets(); if (orientation == JSplitPane.VERTICAL_SPLIT) { int extraX = (insets != null) ? insets.left : 0; int blockSize = getHeight(); if (insets != null) { blockSize -= (insets.top + insets.bottom); blockSize = Math.max(blockSize, 0); } blockSize = Math.min(blockSize, oneTouchSize); int y = (c.getSize().height - blockSize) / 2; if (!centerOneTouchButtons) { y = (insets != null) ? insets.top : 0; extraX = 0; } int width = (int) MyBasicSplitPaneDivider.this.getSize().getWidth(); x1 = width / 2 - oneTouchSize; leftButton.setBounds(extraX - oneTouchOffset + width / 2, y, blockSize * 2, blockSize); rightButton.setBounds(extraX - oneTouchOffset + oneTouchSize * 2 + width / 2, y, blockSize * 2, blockSize); } else { int extraY = (insets != null) ? insets.top : 0; int blockSize = getWidth(); if (insets != null) { blockSize -= (insets.left + insets.right); blockSize = Math.max(blockSize, 0); } blockSize = Math.min(blockSize, oneTouchSize); int x = (c.getSize().width - blockSize) / 2; if (!centerOneTouchButtons) { x = (insets != null) ? insets.left : 0; extraY = 0; } int height = (int) MyBasicSplitPaneDivider.this.getSize().getHeight(); y1 = height / 2 - oneTouchSize; leftButton.setBounds(x, extraY - oneTouchOffset + height / 2, blockSize, blockSize * 2); rightButton.setBounds(x, extraY - oneTouchOffset + oneTouchSize * 2 + height / 2, blockSize, blockSize * 2); } } else { leftButton.setBounds(-5, -5, 1, 1); rightButton.setBounds(-5, -5, 1, 1); } } } public Dimension minimumLayoutSize(Container c) { // NOTE: This isn't really used, refer to // BasicSplitPaneDivider.getPreferredSize for the reason. // I leave it in hopes of having this used at some point. if (splitPane == null) { return new Dimension(0, 0); } Dimension buttonMinSize = null; if (splitPane.isOneTouchExpandable() && leftButton != null) { buttonMinSize = leftButton.getMinimumSize(); } Insets insets = getInsets(); int width = getDividerSize(); int height = width; if (orientation == JSplitPane.VERTICAL_SPLIT) { if (buttonMinSize != null) { int size = buttonMinSize.height; if (insets != null) { size += insets.top + insets.bottom; } height = Math.max(height, size); } width = 1; } else { if (buttonMinSize != null) { int size = buttonMinSize.width; if (insets != null) { size += insets.left + insets.right; } width = Math.max(width, size); } height = 1; } return new Dimension(width, height); } public Dimension preferredLayoutSize(Container c) { return minimumLayoutSize(c); } public void removeLayoutComponent(Component c) { } public void addLayoutComponent(String string, Component c) { } } // End of class BasicSplitPaneDivider.DividerLayout } }
相关推荐
JSplitPane
add(new JLabel("Divider Size:")); add(dividerSize); add(new JLabel("Orientation:")); add(orientation); // 监听事件 oneTouch.addItemListener(...); continuous.addItemListener(...); dividerSize....
【kk.rar】是一个压缩包文件,其中包含了名为"jsplitpane UI_成绩管理系统"的相关内容。这个系统显然是一个教育或教学环境中使用的应用,用于管理学生的成绩。【jsplitpane】是Java Swing库中的一个组件,它在用户...
JSplitPane是Swing库提供的一个分割面板组件。它可以在图形界面中创建两个子组件,并允许用户通过拖动分割条来调整子组件的大小。
NULL 博文链接:https://silentwu.iteye.com/blog/1605617
分割面板通常用于将面板分割成两个部分,每部分可以放置不同的组件,用户可以通过拖动中间的分隔条来调整两侧组件所占的空间大小。JSplitPane适用于需要同时显示两组组件,并且希望用户能够根据需要调整这些组件显示...
通过设置一系列的属性,我们可以定制JSplitPane的行为和外观。 - 设置分割线能否一次性展开(`setOneTouchExpandable`) ```java splitPane.setOneTouchExpandable(true); // 显示分割线上的箭头按钮,快速展开或折叠...
JSplitPane是Java Swing库中用于创建可分割窗口界面的一个控件。通过JSplitPane,我们可以把一个主窗口分割成两个部分,每部分可以分别放置不同的组件,以实现复杂布局的设计。这种控件非常适合于那些需要动态分配...
分隔条(divider)位于两个组件之间,用户可以通过拖动分隔条来改变两边组件的大小。JSplitPane提供了五种预定义的分隔条位置模式:LEFT_TO_RIGHT, RIGHT_TO_LEFT, TOP_TO_BOTTOM, BOTTOM_TO_TOP, 和LAST_TO_FIRST。...
在API层面,JDK6添加了多个新类和接口,如Swing的JSplitPane的divider移动事件、JDBC 4.0规范的实现、Java Persistence API (JPA) 1.0、Java Management Extensions (JMX)的增强,以及对XML处理的改进等。...
在Java Swing库中,`JSplitPane`是一个非常重要的组件,它允许用户动态地调整两个区域的大小。这个组件常用于构建用户界面,使用户能够根据自己的需求自定义视图的比例。在本教程中,我们将深入探讨`JSplitPane`的...
`BorderLayout`是一种常见的布局管理器,用于将组件放置在容器的北、南、东、西和中间五个区域。 ```java JSplitPane splitPane = new JSplitPane(); splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT); ...
在IT领域,JTree是一种广泛使用的Java Swing组件,它允许用户以树形结构来展示数据。这个组件在GUI(图形用户界面)应用中特别常见,因为它能清晰地组织层次化的信息,比如文件系统目录、数据库结构或者项目组织。...
顶级容器和中间级容器;创建窗口(JFrame);setDefaultCloseOperation方法;向窗口中放组件;布局管理(Layout Managers);布局管理器的种类;BorderLayout;BorderLayout Example;BorderLayout的特征;BorderLayout的典型例子...
JSplitPane包含两个或更多的组件,之间有一个可调节的分隔条(Divider),用户可以通过拖动分隔条改变各个组件的大小。 在`www.pudn.com.txt`可能包含了关于该程序的详细说明、源代码注释或者是下载和使用该程序的...
JSplitPane spane=new JSplitPane(JSplitPane.VERTICAL_SPLIT); //实例化分隔面板 p1.add(new JLabel("地址")); //增加组件到面板上 p1.add(jtfAddress); spane.add(new JScrollPane(jtpShow),...
本文主要分为以下几个部分:理解JSplitPane、实现面板分割、整合其他组件如JList,以及如何增强应用安全性。 ### 一、理解JSplitPane `JSplitPane` 是Swing中的一个类,用于创建可以动态调整大小的分割窗口。它...
中间容器是指-between顶层容器和基本组件之间的容器,例如JPanel、JScrollPane、JSplitPane、JTabbedPane等。它们提供了将有关组件按照某种布局组合在一起,然后放入中间容器或顶层容器的功能。 基本组件 基本组件...
在 Java 中,组件可以分为顶层容器、中间容器、特殊容器和基本组件四种。下面对每种组件的常用构造方法进行详细介绍。 顶层容器 顶层容器是 GUI 中的最顶层容器,用于承载其他组件。常用的顶层容器包括: * ...
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, rightPanel); // 设置初始分割比例 splitPane.setDividerLocation(150); // 将JSplitPane添加到主框架 frame.add(splitPane...