tag:blogger.com,1999:blog-44817815854188428402024-03-16T10:09:30.131+09:00Java Swing TipsIntroduce the GUI program of Java Swing using small source code examples.ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.comBlogger212125tag:blogger.com,1999:blog-4481781585418842840.post-30140103891855942582024-02-29T16:27:00.001+09:002024-02-29T16:27:54.887+09:00Paint JMenuItem selection rollover with rounded rectangle
download example.jar
download src.zip
repository
Code
class BasicRoundMenuItemUI extends BasicMenuItemUI {
@Override protected void paintBackground(
Graphics g, JMenuItem menuItem, Color bgColor) {
ButtonModel m = menuItem.getModel();
Color oldColor = g.getColor();
int menuWidth = menuItem.getWidth();
int menuHeight = menuItem.getHeight();
if (ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-68661956020390393562024-01-31T14:33:00.002+09:002024-01-31T14:33:51.471+09:00Paint a JProgressBar with indeterminate progress status in a cell of a JTable
download example.jar
download src.zip
repository
Code
private final JTable table = new JTable(model) {
@Override public void updateUI() {
super.updateUI();
removeColumn(getColumnModel().getColumn(3));
JProgressBar progress = new JProgressBar();
TableCellRenderer renderer = new DefaultTableCellRenderer();
TableColumn tc = getColumnModel().getColumn(2);
ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-53687887057178351462023-12-31T19:22:00.002+09:002023-12-31T19:22:46.253+09:00Create a 4-digit numeric PIN code input field using JPasswordField
download example.jar
download src.zip
repository
Code
class PinCodeDocumentFilter extends DocumentFilter {
public static final int MAX = 4;
@Override public void replace(
DocumentFilter.FilterBypass fb, int offset,
int length, String text, AttributeSet attrs) throws BadLocationException {
String str = fb.getDocument().getText(
0, fb.getDocument().getLength()) +ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-66186163798893864052023-11-30T16:34:00.002+09:002023-11-30T16:34:21.915+09:00Split TableColumn of JTableHeader with diagonal line Border
download example.jar
download src.zip
repository
Code
int size = 32;
JTable table = new JTable(model) {
@Override public void updateUI() {
super.updateUI();
setRowHeight(size);
TableCellRenderer hr = new VerticalTableHeaderRenderer();
TableColumnModel cm = getColumnModel();
cm.getColumn(0).setHeaderRenderer(
new DiagonallySplitHeaderRenderer());
ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-6715441849481322692023-10-31T21:05:00.000+09:002023-10-31T21:05:04.822+09:00Sort JTable rows with multiple conditions
download example.jar
download src.zip
repository
Code
RowSorter<? extends TableModel> sorter = table.getRowSorter();
if (sorter instanceof TableRowSorter) {
TableRowSorter<? extends TableModel> rs
= (TableRowSorter<? extends TableModel>) sorter;
rs.setComparator(0, Comparator.comparing(RowData::getPosition));
rs.setComparator(1, Comparator.comparing(RowData:ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-14797190608105882832023-09-30T20:14:00.003+09:002023-10-31T21:07:19.552+09:00Move the selected item in JList up or down by clicking on the JButton placed on the JToolBar
download example.jar
download src.zip
repository
Since DefaultListModel does not have a move method like DefaultTableModel#moveRow(int start, int end, int to), the DefaultListModel#get(int index), DefaultListModel#remove(int index), and DefaultListModel#add(int index, E element) methods are used in combination to move selected items up and down the JList.
Code
JButton up = new JButtonateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-37539030688508250022023-08-31T17:43:00.000+09:002023-08-31T17:43:02.082+09:00Hide the check icon on the JRadioButtonMenuItem and reduce the text offset
download example.jar
download src.zip
repository
Code
UIManager.put(PRE + "minimumTextOffset", 10);
UIManager.put(PRE + "afterCheckIconGap", 0);
UIManager.put(PRE + "checkIconOffset", 0);
Icon checkIcon = getCheckIcon();
int height = checkIcon == null ? 22 : checkIcon.getIconHeight();
UIManager.put(PRE + "checkIcon", new EmptyIcon());
Dimension d = new Dimension(100, height);
JPopupMenu ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-30203812368699320692023-07-31T13:25:00.002+09:002023-09-03T14:44:25.110+09:00Add item check boxes to JList cells
download example.jar
download src.zip
repository
Code
@Override public void setSelectionInterval(int anchor, int lead) {
if (checkedIndex < 0 && isDragging()) {
super.setSelectionInterval(anchor, lead);
} else {
EventQueue.invokeLater(() -> {
if (checkedIndex >= 0 && lead == anchor && checkedIndex == anchor) {
ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-69426443101433312162023-07-01T01:05:00.000+09:002023-07-01T01:05:12.495+09:00Click on the JCheckBox placed in the JTable cell to expand and collapss the row height
download example.jar
download src.zip
repository
Code
int defaultHeight = 20;
JTable table = new JTable(model) {
@Override public void updateUI() {
super.updateUI();
setAutoCreateRowSorter(true);
setSurrendersFocusOnKeystroke(true);
setRowHeight(defaultHeight);
setDefaultRenderer(RowHeader.class, new RowHeaderRenderer());
setDefaultEditor(RowHeader.class, new ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-73314273905208794522023-04-30T12:14:00.001+09:002023-04-30T12:14:34.535+09:00Change the tooltip of a tab in the JTabbedPane to a speech balloon shape, depending on the position of the tab.
download example.jar
download src.zip
repository
Code
class BalloonToolTip extends JToolTip {
private static final int SIZE = 4;
private static final double ARC = 4d;
private transient HierarchyListener listener;
private transient Shape shape;
@Override public void updateUI() {
removeHierarchyListener(listener);
super.updateUI();
setLayout(new BorderLayout());
ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-21036241106575688042023-03-31T14:26:00.003+09:002023-04-03T18:23:15.113+09:00Create a dot matrix LED digital clock with JList
download example.jar
download src.zip
repository
Code
private static JList<Boolean> makeLedDotMatrixList(
ListModel<Boolean> model, Dimension dim) {
return new JList<Boolean>(model) {
@Override public void updateUI() {
setFixedCellWidth(dim.width);
setFixedCellHeight(dim.height);
setVisibleRowCount(ROW);
setCellRenderer(null);
ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-56321671993075464822023-02-28T10:57:00.000+09:002023-02-28T10:57:37.241+09:00Draw a projection-transformed regular hexahedron wireframe in JPanel and rotate it in space by mouse dragging
download example.jar
download src.zip
repository
Code
class Vertex {
private double dx;
private double dy;
private double dz;
public double vx;
public double vy;
protected Vertex(double dx, double dy, double dz) {
this.dx = dx;
this.dy = dy;
this.dz = dz;
projectionTransformation();
}
private void projectionTransformation() {
double screenDistance = ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-50673513999080235182023-01-31T10:45:00.001+09:002023-01-31T10:45:43.264+09:00Create numbers for a 7-segment digital clock using Path2D
download example.jar
download src.zip
repository
Code
class DigitalNumber {
private final double isosceles;
private final double dx;
private final double dy;
private final double width;
private final double height;
private final Rectangle rect = new Rectangle();
public static final Color OFF = new Color(0xCC_CC_CC);
public static final Color ON = Color.DARK_GRAY;
publicateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-83726908275825733022022-12-31T17:25:00.000+09:002022-12-31T17:25:04.104+09:00Inverse the display position of JSlider's ticks and knobs
download example.jar
download src.zip
repository
Code
class VerticalFlipLayerUI extends LayerUI<JComponent> {
@Override public void paint(Graphics g, JComponent c) {
if (c instanceof JLayer) {
Graphics2D g2 = (Graphics2D) g.create();
g2.setTransform(getAffineTransform(c.getSize()));
super.paint(g2, c);
g2.dispose();
} else {
super.paint(g, c)ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-30933522136298205522022-11-30T13:01:00.002+09:002022-11-30T13:01:53.124+09:00Rotate JTableHeader column title string to display vertically
download example.jar
download src.zip
repository
Code
class VerticalTableHeaderRenderer implements TableCellRenderer {
private static final String ASCENDING = "Table.ascendingSortIcon";
private static final String DESCENDING = "Table.descendingSortIcon";
private final Icon ascendingIcon;
private final Icon descendingIcon;
private final EmptyIcon emptyIcon = new EmptyIcon();
ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-13662154332040458732022-10-31T00:30:00.001+09:002022-10-31T00:30:00.206+09:00Add a header to JPopupMenu to enable repositioning by mouse dragging
download example.jar
download src.zip
repository
Code
class PopupHeaderMouseListener extends MouseAdapter {
private final Point startPt = new Point();
@Override public void mousePressed(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
startPt.setLocation(e.getPoint());
}
}
@Override public void mouseDragged(MouseEvent e) {
Component c = ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-25573831956872676132022-09-30T15:12:00.000+09:002022-09-30T15:12:01.374+09:00Make the editable JTextArea scrollable beyond its last line
download example.jar
download src.zip
repository
Code
// https://stackoverflow.com/questions/36715803/scrolling-past-the-end-in-idea
// IntelliJ IDEA: Settings -> Editor -> General -> Check Show virtual space at file bottom
JTextArea textArea = new JTextArea() {
// https://stackoverflow.com/questions/32679335/java-jtextarea-allow-scrolling-beyond-end-of-text
@Override public ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-13297596490452081812022-08-31T05:28:00.005+09:002022-09-16T13:48:49.427+09:00Use AffineTransform to place Roman numerals on an analog clock face
download example.jar
download src.zip
repository
Code
private final String[] arabicNumerals = {
"12", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"
};
private final String[] romanNumerals = {
"XII", "I", "II", "III", "IIII", "V", "VI", "VII", "VIII", "IX", "X", "XI"
};
private void paintClockNumbers(
Graphics2D g2, double radius, double hourMarkerLen) {
ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-74682348942176329042022-07-31T20:11:00.000+09:002022-07-31T20:11:09.855+09:00use a newspaper-style JList that can scroll and display multiple items as a ComboBoxEditor
download example.jar
download src.zip
repository
Code
ListModel<ListItem> model = makeModel();
JList<ListItem> list = new NewspaperStyleList<>(model);
JScrollPane scroll = new JScrollPane(list) {
@Override public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
d.width = 62 * 3 + 10;
d.height = 32;
return d;
}
};
ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-41013767862363513062022-06-30T18:28:00.003+09:002022-07-29T11:28:55.431+09:00Change the height of a drop-down list of JComboBox by mouse dragging
download example.jar
download src.zip
repository
Code
JPopupMenu popup = new JPopupMenu();
popup.setBorder(BorderFactory.createEmptyBorder());
popup.setPopupSize(240, 120);
JLabel bottom = new JLabel("", new DotIcon(), SwingConstants.CENTER);
MouseInputListener rwl = new ResizeWindowListener(popup);
bottom.addMouseListener(rwl);
bottom.addMouseMotionListener(rwl);
bottom.setCursor(ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-12233753399119557632022-05-30T11:34:00.001+09:002022-05-30T11:34:42.608+09:00Focus Border of the previously selected tab in JTabbedPane is thinly displayed as history
download example.jar
download src.zip
repository
Code
class LineFocusTabbedPane extends JTabbedPane {
private transient ChangeListener listener;
protected LineFocusTabbedPane() {
super();
}
@Override public void updateUI() {
removeChangeListener(listener);
UIManager.put("TabbedPane.tabInsets", new InsetsUIResource(1, 4, 0, 4));
UIManager.put("ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-86630787068134020802022-04-30T05:46:00.000+09:002022-04-30T05:46:04.121+09:00Disable the arrow button when the knob position of the JScrollBar is on the boundary
download example.jar
download src.zip
repository
Code
// UIManager.put("ScrollBar.alwaysShowThumb", Boolean.TRUE);
JScrollPane scroll = new JScrollPane(new JTable(24, 3));
scroll.getVerticalScrollBar().addAdjustmentListener(e -> {
JScrollBar scrollBar = (JScrollBar) e.getAdjustable();
BoundedRangeModel m = scrollBar.getModel();
int value = m.getValue();
boolean max = value == ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-28431034436445715492022-03-30T18:40:00.001+09:002022-03-30T18:40:25.831+09:00Paint the major tick marks inside the JSlider track and the current value inside the knob
download example.jar
download src.zip
repository
Code
JSlider slider = new JSlider();
slider.setSnapToTicks(true);
slider.setMajorTickSpacing(10);
slider.addMouseMotionListener(new MouseAdapter() {
@Override public void mouseDragged(MouseEvent e) {
super.mouseDragged(e);
e.getComponent().repaint();
}
});
UIDefaults d = new UIDefaults();
d.put("Slider.thumbWidth", 24);
d.put(ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-85695655651547113572022-02-28T15:18:00.001+09:002022-02-28T15:18:09.903+09:00Create a new JFrame when the JTabbedPane tab is dropped outside the frame
download example.jar
download src.zip
repository
Code
class TabDragSourceListener implements DragSourceListener {
@Override public void dragEnter(DragSourceDragEvent e) {
e.getDragSourceContext().setCursor(DragSource.DefaultMoveDrop);
}
@Override public void dragExit(DragSourceEvent e) {
e.getDragSourceContext().setCursor(DragSource.DefaultMoveNoDrop);
}
@Override ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0tag:blogger.com,1999:blog-4481781585418842840.post-47526100046455603562022-01-31T12:14:00.000+09:002022-01-31T12:14:48.836+09:00Fix the JToolTip display of JList cells to correspond to after mouse wheel rotation
download example.jar
download src.zip
repository
Code
JList<String> list1 = new JList<String>(model) {
@Override public void updateUI() {
super.updateUI();
setCellRenderer(new TooltipListCellRenderer<>());
}
};
JScrollPane scroll1 = new JScrollPane(list1);
scroll1.addMouseWheelListener(e -> {
JScrollPane scrollPane = (JScrollPane) e.getComponent();
ateraihttp://www.blogger.com/profile/07647339065761407369noreply@blogger.com0