Chcę utworzyć tytułową ramkę z tytułem jako CheckBox.Utwórz tytułową ramkę z tytułem jako JCheckBox
Jak mam to zrobić?
Chcę utworzyć tytułową ramkę z tytułem jako CheckBox.Utwórz tytułową ramkę z tytułem jako JCheckBox
Jak mam to zrobić?
Ten poradnik jest dokładnie to, czego potrzebujesz: CLICK
Niestety zdjęcia nie są już w internecie, ale można uruchomić aplikację Webstart.
Znalazłem również this example.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;
/**
* @version 1.0 08/12/99
*/
public class CompTitledPaneExample2 extends JFrame {
public CompTitledPaneExample2() {
super("CompTitledPaneExample2");
JCheckBox title = new JCheckBox("Title");
title.setSelected(true);
final CompTitledPane p1 = new CompTitledPane(title);
title.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
p1.setEnabled(e.getStateChange() == ItemEvent.SELECTED);
}
});
APanel p2 = new APanel();
p1.setTransmittingAllowed(true);
p1.setTransmitter(p2);
p1.getContentPane().add(p2);
getContentPane().add(p1, BorderLayout.CENTER);
}
class APanel extends JPanel implements StateTransmitter {
JButton button;
JTextField textField;
APanel() {
button = new JButton("abc");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Ouch!");
}
});
textField = new JTextField(10);
textField.setText("text");
add(button, BorderLayout.NORTH);
add(textField, BorderLayout.SOUTH);
}
public void setChildrenEnabled(boolean enable) {
button.setEnabled(enable);
textField.setEnabled(enable);
}
}
public static void main(String args[]) {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (Exception evt) {
}
CompTitledPaneExample2 frame = new CompTitledPaneExample2();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.setSize(280, 110);
frame.setVisible(true);
}
}
class CompTitledPane extends JPanel {
protected CompTitledBorder border;
protected JComponent component;
protected JPanel panel;
protected boolean transmittingAllowed;
protected StateTransmitter transmitter;
public CompTitledPane() {
this(new JLabel("Title"));
// debug
// JLabel label = (JLabel)getTitleComponent();
// label.setOpaque(true);
// label.setBackground(Color.yellow);
}
public CompTitledPane(JComponent component) {
this.component = component;
border = new CompTitledBorder(component);
setBorder(border);
panel = new JPanel();
setLayout(null);
add(component);
add(panel);
transmittingAllowed = false;
transmitter = null;
}
public JComponent getTitleComponent() {
return component;
}
public void setTitleComponent(JComponent newComponent) {
remove(component);
add(newComponent);
border.setTitleComponent(newComponent);
component = newComponent;
}
public JPanel getContentPane() {
return panel;
}
public void doLayout() {
Insets insets = getInsets();
Rectangle rect = getBounds();
rect.x = 0;
rect.y = 0;
Rectangle compR = border.getComponentRect(rect, insets);
component.setBounds(compR);
rect.x += insets.left;
rect.y += insets.top;
rect.width -= insets.left + insets.right;
rect.height -= insets.top + insets.bottom;
panel.setBounds(rect);
}
public void setTransmittingAllowed(boolean enable) {
transmittingAllowed = enable;
}
public boolean getTransmittingAllowed() {
return transmittingAllowed;
}
public void setTransmitter(StateTransmitter transmitter) {
this.transmitter = transmitter;
}
public StateTransmitter getTransmitter() {
return transmitter;
}
public void setEnabled(boolean enable) {
super.setEnabled(enable);
if (transmittingAllowed && transmitter != null) {
transmitter.setChildrenEnabled(enable);
}
}
}
interface StateTransmitter {
public void setChildrenEnabled(boolean enable);
}
class CompTitledBorder extends TitledBorder {
protected JComponent component;
public CompTitledBorder(JComponent component) {
this(null, component, LEFT, TOP);
}
public CompTitledBorder(Border border) {
this(border, null, LEFT, TOP);
}
public CompTitledBorder(Border border, JComponent component) {
this(border, component, LEFT, TOP);
}
public CompTitledBorder(Border border, JComponent component,
int titleJustification, int titlePosition) {
super(border, null, titleJustification, titlePosition, null, null);
this.component = component;
if (border == null) {
this.border = super.getBorder();
}
}
public void paintBorder(Component c, Graphics g, int x, int y, int width,
int height) {
Rectangle borderR = new Rectangle(x + EDGE_SPACING, y + EDGE_SPACING,
width - (EDGE_SPACING * 2), height - (EDGE_SPACING * 2));
Insets borderInsets;
if (border != null) {
borderInsets = border.getBorderInsets(c);
} else {
borderInsets = new Insets(0, 0, 0, 0);
}
Rectangle rect = new Rectangle(x, y, width, height);
Insets insets = getBorderInsets(c);
Rectangle compR = getComponentRect(rect, insets);
int diff;
switch (titlePosition) {
case ABOVE_TOP:
diff = compR.height + TEXT_SPACING;
borderR.y += diff;
borderR.height -= diff;
break;
case TOP:
case DEFAULT_POSITION:
diff = insets.top/2 - borderInsets.top - EDGE_SPACING;
borderR.y += diff;
borderR.height -= diff;
break;
case BELOW_TOP:
case ABOVE_BOTTOM:
break;
case BOTTOM:
diff = insets.bottom/2 - borderInsets.bottom - EDGE_SPACING;
borderR.height -= diff;
break;
case BELOW_BOTTOM:
diff = compR.height + TEXT_SPACING;
borderR.height -= diff;
break;
}
border.paintBorder(c, g, borderR.x, borderR.y, borderR.width,
borderR.height);
Color col = g.getColor();
g.setColor(c.getBackground());
g.fillRect(compR.x, compR.y, compR.width, compR.height);
g.setColor(col);
component.repaint();
}
public Insets getBorderInsets(Component c, Insets insets) {
Insets borderInsets;
if (border != null) {
borderInsets = border.getBorderInsets(c);
} else {
borderInsets = new Insets(0, 0, 0, 0);
}
insets.top = EDGE_SPACING + TEXT_SPACING + borderInsets.top;
insets.right = EDGE_SPACING + TEXT_SPACING + borderInsets.right;
insets.bottom = EDGE_SPACING + TEXT_SPACING + borderInsets.bottom;
insets.left = EDGE_SPACING + TEXT_SPACING + borderInsets.left;
if (c == null || component == null) {
return insets;
}
int compHeight = 0;
if (component != null) {
compHeight = component.getPreferredSize().height;
}
switch (titlePosition) {
case ABOVE_TOP:
insets.top += compHeight + TEXT_SPACING;
break;
case TOP:
case DEFAULT_POSITION:
insets.top += Math.max(compHeight, borderInsets.top)
- borderInsets.top;
break;
case BELOW_TOP:
insets.top += compHeight + TEXT_SPACING;
break;
case ABOVE_BOTTOM:
insets.bottom += compHeight + TEXT_SPACING;
break;
case BOTTOM:
insets.bottom += Math.max(compHeight, borderInsets.bottom)
- borderInsets.bottom;
break;
case BELOW_BOTTOM:
insets.bottom += compHeight + TEXT_SPACING;
break;
}
return insets;
}
public JComponent getTitleComponent() {
return component;
}
public void setTitleComponent(JComponent component) {
this.component = component;
}
public Rectangle getComponentRect(Rectangle rect, Insets borderInsets) {
Dimension compD = component.getPreferredSize();
Rectangle compR = new Rectangle(0, 0, compD.width, compD.height);
switch (titlePosition) {
case ABOVE_TOP:
compR.y = EDGE_SPACING;
break;
case TOP:
case DEFAULT_POSITION:
compR.y = EDGE_SPACING
+ (borderInsets.top - EDGE_SPACING - TEXT_SPACING - compD.height)
/2;
break;
case BELOW_TOP:
compR.y = borderInsets.top - compD.height - TEXT_SPACING;
break;
case ABOVE_BOTTOM:
compR.y = rect.height - borderInsets.bottom + TEXT_SPACING;
break;
case BOTTOM:
compR.y = rect.height
- borderInsets.bottom
+ TEXT_SPACING
+ (borderInsets.bottom - EDGE_SPACING - TEXT_SPACING - compD.height)
/2;
break;
case BELOW_BOTTOM:
compR.y = rect.height - compD.height - EDGE_SPACING;
break;
}
switch (titleJustification) {
case LEFT:
case DEFAULT_JUSTIFICATION:
compR.x = TEXT_INSET_H + borderInsets.left;
break;
case RIGHT:
compR.x = rect.width - borderInsets.right - TEXT_INSET_H
- compR.width;
break;
case CENTER:
compR.x = (rect.width - compR.width)/2;
break;
}
return compR;
}
}
Łatwym rozwiązaniem jest po prostu dokonać wyboru zachodzić na drugi panel z tytułowego granicy z tekstem tytułowym jak tylko „”.
Można to zrobić, umieszczając na przykład obramowany JPanel i JCheckBox w tej samej komórce GridBagLayout. Tylko pamiętaj, aby najpierw dodać pole wyboru i nadać mu różne wstawki GridBagConstraints niż obramowany JPanel tak, aby był wyrównany.
Ustawiam tekst tytułowy na "", aby automatycznie dostosowywał zawartość i inne rzeczy, aby zrobić miejsce na tytuł, tak jak zwykle, ale równie dobrze można użyć innej granicy i zmierzyć wszystko samemu.
Uznanie dla JavaLobby i Stephana za podstawę tej odpowiedzi.
Jednakże, jest to przykład cut-down, które umożliwia łatwe wdrożenie TitledBorder
z JCheckBox
:
public class CheckBoxTitledBorder extends AbstractBorder {
private final TitledBorder _parent;
private final JCheckBox _checkBox;
public CheckBoxTitledBorder(String title, boolean selected) {
_parent = BorderFactory.createTitledBorder(title);
_checkBox = new JCheckBox(title, selected);
_checkBox.setHorizontalTextPosition(SwingConstants.LEFT);
}
public boolean isSelected() {
return _checkBox.isSelected();
}
public void addActionListener(ActionListener listener) {
_checkBox.addActionListener(listener);
}
@Override
public boolean isBorderOpaque() {
return true;
}
@Override
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
Insets borderInsets = _parent.getBorderInsets(c);
Insets insets = getBorderInsets(c);
int temp = (insets.top - borderInsets.top)/2;
_parent.paintBorder(c, g, x, y + temp, width, height - temp);
Dimension size = _checkBox.getPreferredSize();
final Rectangle rectangle = new Rectangle(5, 0, size.width, size.height);
final Container container = (Container) c;
container.addMouseListener(new MouseAdapter() {
private void dispatchEvent(MouseEvent me) {
if (rectangle.contains(me.getX(), me.getY())) {
Point pt = me.getPoint();
pt.translate(-5, 0);
_checkBox.setBounds(rectangle);
_checkBox.dispatchEvent(new MouseEvent(_checkBox, me.getID(),
me.getWhen(), me.getModifiers(), pt.x, pt.y, me.getClickCount(), me.isPopupTrigger(), me.getButton()));
if (!_checkBox.isValid()) {
container.repaint();
}
}
}
public void mousePressed(MouseEvent me) {
dispatchEvent(me);
}
public void mouseReleased(MouseEvent me) {
dispatchEvent(me);
}
});
SwingUtilities.paintComponent(g, _checkBox, container, rectangle);
}
@Override
public Insets getBorderInsets(Component c) {
Insets insets = _parent.getBorderInsets(c);
insets.top = Math.max(insets.top, _checkBox.getPreferredSize().height);
return insets;
}
}
co mają u wykonanej do tej pory? Czy możesz pokazać swój kod? – Ghostman
Zobacz ten link: http://stackoverflow.com/questions/431654/is-there-a-group-box-equivalent-in-java-swing – AlexR