How to create a JComboBox whose elements each have two different styles? - java

I'm creating a Java application by using Swing. It contains a JTextField with a JComboBox which contains the last entered words with the time when these words were entered. The String with the time should be in another size and color (smaller and in light grey) as the last entered words (standard style). So in each element of the JComboBox should be used two different styles. How can I do that?

Here is an example:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.util.Date;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
public class ComboSample implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new ComboSample());
}
#Override
public void run() {
JFrame frm = new JFrame("Combo example");
final JTextField fld = new JTextField(20);
TextData[] data = new TextData[]{new TextData("First", new Date(System.currentTimeMillis() - 100000)),
new TextData("Second", new Date(System.currentTimeMillis() - 200000)),
new TextData("Third", new Date(System.currentTimeMillis() - 300000)),
new TextData("Fourth", new Date(System.currentTimeMillis() - 400000))};
JComboBox<TextData> cb = new JComboBox<>(data);
cb.setSelectedItem(null);
cb.addActionListener(new ActionListener() {
#Override
public void actionPerformed(ActionEvent e) {
JComboBox cb = (JComboBox) e.getSource();
TextData td = (TextData) cb.getSelectedItem();
if (td != null) {
fld.setText(td.getText());
}
}
});
frm.add(fld);
frm.add(cb, BorderLayout.EAST);
frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frm.pack();
frm.setLocationRelativeTo(null);
frm.setVisible(true);
}
private static class TextData {
private static final DateFormat FORMAT = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
private final String text;
private final Date timestamp;
public TextData(String text, Date timestamp) {
this.text = text;
this.timestamp = timestamp;
}
public String getText() {
return text;
}
#Override
public String toString() {
return "<html>" + text + " <span style=\"color:#D3D3D3\"><i>" + FORMAT.format(timestamp) + "</i></span></html>";
}
}
}

An easy approach is to choose a Look and Feel for that allow to achieve that.
Another way can be to create a different JLabel with the background color that you need for every JComboBox element and add them with:
JLabel label = new JLabel("Some text");
label.setBackground(Color.grey);
label.setOpaque(true);
jComboBox.addItem(label);
JLabel anotherLabel = new JLabel("Another text");
anotherLabel.setBackground(Color.white);
anotherLabel.setOpaque(true);
jComboBox.addItem(anotherLabel);

Related

How do i create Addition assignments for every value in a JComboBox?

I have a JComboBox that holds an Enum class with months and a JTextfield(txtHours) for entering amount of workhours done for every month.
I have another JLabel that holds the value for the total of all months below
double hours = Double.parseDouble(txtHours.getText());
yearHours += hours;
yLabel.setText("Hours this year: " + yearHours);
How can i save and update the amount of hours for a specific month so that the label updates itself at runtime depending on which month is chosen from the combobox?
if (e.getSource() == cmbMonths){
mLabel.setText("Hours for " + cmbMonths.getSelectedItem() +": " + monthHours);
}
To answer your question, namely
How can i save and update the amount of hours for a specific month
I would use a Map where the Map key would be the month and the value would be the total hours worked for that month. In the date-time API, that was added in Java 1.8, there is a Month enum so I would use that as the Map key.
Rather than using a JTextField to enter the hours worked, I would use a JSpinner.
In order to update the total hours worked, I would add a ChangeListener to the JSpinner model so that each time its value was changed, the text of the JLabel displaying total hours worked would get updated so as to display the new total.
The only thing remaining is to add an ActionListener to the JComboBox such that it displays the entered value for total hours worked whenever the user chooses a particular month.
Here is a minimal, reproducible example.
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.time.Month;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class EnumCombo implements ActionListener, ChangeListener, Runnable {
private Map<Month, Double> hoursWorked;
private JComboBox<Month> monthsCombo;
private JFrame frame;
private JLabel totalHoursLabel;
private JSpinner hoursSpinner;
public EnumCombo() {
hoursWorked = new HashMap<Month, Double>(12);
for (Month month : Month.values()) {
hoursWorked.put(month, Double.valueOf(0));
}
}
#Override // java.awt.event.ActionListener
public void actionPerformed(ActionEvent event) {
Object source = event.getSource();
if (source instanceof JComboBox<?>) {
JComboBox<?> combo = (JComboBox<?>) source;
Object obj = combo.getSelectedItem();
if (obj instanceof Month) {
Month month = (Month) obj;
hoursSpinner.setValue(hoursWorked.get(month));
}
}
}
#Override // javax.swing.event.ChangeListener
public void stateChanged(ChangeEvent evt) {
Object source = evt.getSource();
if (source instanceof SpinnerNumberModel) {
SpinnerNumberModel snm = (SpinnerNumberModel) source;
Object obj = snm.getValue();
if (obj instanceof Double) {
Double value = (Double) obj;
hoursWorked.put((Month) monthsCombo.getSelectedItem(), value);
Double total = hoursWorked.values()
.stream()
.reduce(Double.valueOf(0),
(tot, val) -> tot + val);
totalHoursLabel.setText(total.toString());
}
}
}
#Override
public void run() {
showGui();
}
private JPanel createInputPanel() {
JPanel inputPanel = new JPanel();
JLabel monthLabel = new JLabel("Month");
inputPanel.add(monthLabel);
monthsCombo = new JComboBox<Month>(Month.values());
monthsCombo.addActionListener(this);
inputPanel.add(monthsCombo);
JLabel hoursLabel = new JLabel("Hours Worked");
inputPanel.add(hoursLabel);
SpinnerNumberModel snm = new SpinnerNumberModel(Double.valueOf(0),
Double.valueOf(0),
Double.valueOf(999),
Double.valueOf(1));
snm.addChangeListener(this);
hoursSpinner = new JSpinner(snm);
inputPanel.add(hoursSpinner);
return inputPanel;
}
private JPanel createTotalPanel() {
JPanel totalPanel = new JPanel();
JLabel label = new JLabel("Total Hours");
totalPanel.add(label);
totalHoursLabel = new JLabel("0");
totalPanel.add(totalHoursLabel);
return totalPanel;
}
private void showGui() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(createInputPanel(), BorderLayout.PAGE_START);
frame.add(createTotalPanel(), BorderLayout.PAGE_END);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new EnumCombo());
}
}
Note that method stateChanged, in the above code, uses the stream API which was also added in Java 1.8
Here is a screen capture of the running app.

Get value of string in try other method

So, this prog getting value car_number from data base "getReprt" method , and give name to button as value from db. Also, I need to get this value next, to action listener btn_listener for each button it s own value. But whis this code, I only get last data value, and it`s the same for each button. How can I give every actionlistener situation differnet values?
what am I doing wrong?
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
public class Car2q {
private Connection con;
private ResultSet rs;
static JTextArea textArea = new JTextArea();
static login frame = new login();
static JScrollPane scrollPane = new JScrollPane();
static JSplitPane splitPane = new JSplitPane();
static JPanel panel_left = new JPanel();
static JPanel panel_right = new JPanel();
static class login extends JFrame {
public static void main(String[] args) throws Exception {
final Car2q c2q = new Car2q();
c2q.getReport();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
frame.setSize(550, 300);
frame.setVisible(true);
frame.add(splitPane);
splitPane.setSize(550, 300);
splitPane.setLeftComponent(scrollPane);
splitPane.setLeftComponent(panel_left);
splitPane.setRightComponent(panel_right);
panel_left.setLayout(new GridLayout(0, 1, 5, 5));
panel_right.setLayout(new GridLayout(0, 2, 5, 5));
}
}
public Car2q() {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
con = DriverManager.getConnection("");
con.createStatement();
}
catch (Exception e) {
System.out.println("Error: " + e);
}
}
public String getReport() {
String car_number = null;
String report = null;
List car_number_list = new ArrayList<>();
try {
PreparedStatement st = null;
String query2 = "select * FROM car_register";
st = con.prepareStatement(query2);
rs = st.executeQuery();
while (rs.next()) {
car_number = rs.getString("car_number");
String gotit = rs.getString("car_number");
JButton btn = new JButton(gotit);
btn.setSize(100, 100);
panel_left.add(btn);
ActionListener actionListener = new btn_listener();
btn.addActionListener(actionListener);
}
}
catch (SQLException e) {
e.printStackTrace();
}
return car_number;
}
public class btn_listener implements ActionListener {
public void actionPerformed(ActionEvent arg0) {
Car2q c2q = new Car2q();
String car = c2q.getReport();
System.out.println(car);
}
}
}
Write your button listener like this:
public class btn_listener implements ActionListener {
private final String car_number;
public bin_listener(String car_number) {
this.car_number = car_number;
}
public void actionPerformed(ActionEvent arg0) {
System.out.println(car_number);
}
}
Then in your loop you create the ActionListener:
ActionListener actionListener = new btn_listener(car_number);
And of course to be idiomatic Java you should use carNumber and BtnListener and so on.
car_number = rs.getString("car_number");
String gotit = rs.getString("car_number");
JButton btn = new JButton(gotit);
You don't need two variables that contain the same value. You just need to set the car number as the text of the button.
Then the code in your ActionListener becomes:
public void actionPerformed(ActionEvent e)
{
JButton button = (JButton)e.getSource();
System.out.println( button.getText() );
}
The ActionListener is now generic and can be shared by all your buttons.
So your code becomes:
ActionListener buttonListener = new CarButtonListener();
while (rs.next()) {
//car_number = rs.getString("car_number");
String gotit = rs.getString("car_number");
JButton btn = new JButton(gotit);
btn.setSize(100, 100);
panel_left.add(btn);
//ActionListener actionListener = new btn_listener();
//btn.addActionListener(actionListener);
btn.addActionListener(buttonListener);
}
This allows your code to be more efficient and use less memory since you only need a single instance of the listener.
Note I renamed your "btn_listener" class to "CarButtonListener" since:
class names should be descriptive
each word in the class name should start with an upper case character

How to dynamically change JButtom background?

So I'm having trouble trying to change the background color of the keys pressed and I'm not entirely sure on how to go about it?
It works as a keyboard, the only issue I have is the method to change the background color when any key is typed
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.AbstractAction;
public abstract class OnScreenKeyboard extends JFrame implements KeyListener
{
String firstRow[] = {"~","1","2","3","4","5","6","7","8","9","0","-","+","Back\nSpace"};
String secondRow[] = {"Tab","Q","W","E","R","T","Y","U","I","O","P","[","]","|"};
String thirdRow[] = {"Caps\nLock","A","S","D","F","G","H","J","K","L",";","'","Enter"};
String fourthRow[] = {"Shift","Z","X","C","V","B","N","M",",",".","?","Space"};
JButton first[] = new JButton[14];
JButton second[] = new JButton[14];
JButton third[] = new JButton[13];
JButton fourth[] = new JButton[12];
Panel keys = new Panel();
Panel text = new Panel();
TextArea textArea = new TextArea();
String strText = "";
private JLabel label1;
private JLabel label2;
private JTextField textField;
public OnScreenKeyboard()
{
super("Typing Application");
label1 = new JLabel("Type some text using your keyboard. The keys you press will be "
+ "highlighed and the text will be displayed");
add(label1);
label2 = new JLabel("Note: clicking the buttons with your mouse will not perform any action");
add(label2);
textField = new JTextField(80);
textField.setEditable(true);
TextFieldHandler handler = new TextFieldHandler();
this.setLayout(new BorderLayout(1,1));
keys.setLayout(new GridLayout(4,14));
text.setLayout(new BorderLayout(1,1));
text.add(textArea);
for(int i=0; i<14; i++)
{
first[i] = new JButton(firstRow[i]);
first[i].setBackground(Color.white);
keys.add(first[i]);
first[i].addKeyListener(this);
}
for(int i=0; i<14; i++)
{
second[i] = new JButton(secondRow[i]);
second[i].setBackground(Color.white);
keys.add(second[i]);
second[i].addKeyListener(this);
}
for(int i=0; i<13; i++)
{
third[i] = new JButton(thirdRow[i]);
third[i].setBackground(Color.white);
keys.add(third[i]);
third[i].addKeyListener(this);
}
for(int i=0; i<12; i++)
{
fourth[i] = new JButton(fourthRow[i]);
fourth[i].setBackground(Color.white);
keys.add(fourth[i]);
fourth[i].addKeyListener(this);
}
add(text, BorderLayout.NORTH);
add(keys,BorderLayout.CENTER);
}
private class TextAreaHandler implements ActionListener
{
public void actionPerformed( ActionEvent event )
{
String string = ""; // declare string to display
if ( event.getSource() == textField )
string = String.format( "%s",
event.getActionCommand() );
}
}
public void actionPerformed(ActionEvent event) {
if (event.getSource() instanceof JButton) {
System.out.println((((JButton) event.getSource()).getActionCommand()));
((JButton) event.getSource()).setBackground(Color.BLUE);
((JButton) event.getSource()).setContentAreaFilled(false);
((JButton) event.getSource()).setOpaque(true);
}
}
#Override
public void keyTyped( KeyEvent event )
{
int keyCode = event.getKeyCode();
strText = String.format( "%s", event.getKeyCode() );
}
private class TextFieldHandler implements ActionListener
{
public void actionPerformed( ActionEvent event )
{
String string = ""; // declare string to display
// user pressed Enter in JTextField textField1
if ( event.getSource() == textField )
string = String.format("%s", event.getActionCommand());
}
}
}
It takes no Java knowledge to know that you don't need 4x14 buttons, and lables and textfilelds to demonstrate a change of background color in one JButton.
Doesn't this MCVE demonstrate it ?
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
public class OnScreenKeyboard extends JFrame{
public OnScreenKeyboard()
{
super();
JButton button = new JButton("T");
add(button,BorderLayout.CENTER);
pack();//"size to fit the preferred size and layouts of its subcomponents"
setVisible(true);//make Jframe show
}
public void actionPerformed(ActionEvent event) {
if (event.getSource() instanceof JButton) {
System.out.println((((JButton) event.getSource()).getActionCommand()));
((JButton) event.getSource()).setBackground(Color.BLUE);
((JButton) event.getSource()).setContentAreaFilled(false);
((JButton) event.getSource()).setOpaque(true);
}
}
//a main is needed to make your code runnable (google MCVE)
public static void main(String[] args) {
new OnScreenKeyboard();
}
}
When it is short and concise, it also help you debug the problem.
Hint: You wrote an ActionListener but you never use it.
If you need more help don't hesitate to ask.

Java GUI to accept only certain names

I'm currently working on a GUI where you enter your name and it tells you whether or not it has been accepted. Say that if the names "John" or "Jane" are entered then you get a "Verified" message or "Unverified" message if you type any other name. Here's what I have so far, just really unsure how to add the IF statement for detecting the certain names. Thanks.
NamePrompt.java
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class NamePrompt extends JFrame{
private static final long serialVersionUID = 1L;
String name;
public NamePrompt(){
setLayout(new BorderLayout());
JLabel enterYourName = new JLabel("Enter Your Name Here:");
JTextField textBoxToEnterName = new JTextField(21);
JPanel panelTop = new JPanel();
panelTop.add(enterYourName);
panelTop.add(textBoxToEnterName);
JButton submit = new JButton("Submit");
submit.addActionListener(new SubmitButton(textBoxToEnterName));
JPanel panelBottom = new JPanel();
panelBottom.add(submit);
//Add panelTop to JFrame
add(panelTop, BorderLayout.NORTH);
add(panelBottom, BorderLayout.SOUTH);
//JFrame set-up
setTitle("Name Prompt Program");
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
}
public static void main(String[] args) {
NamePrompt promptForName = new NamePrompt();
promptForName.setVisible(true);
}
}
SubmitButton.java
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
public class SubmitButton implements ActionListener {
JTextField nameInput;
public SubmitButton(JTextField textfield){
nameInput = textfield;
}
#Override
public void actionPerformed(ActionEvent submitClicked) {
Component frame = new JFrame();
JOptionPane.showMessageDialog(frame , "You've Submitted the name " + nameInput.getText() + " which is allowed.");
}
}
As mentioned in another answer, this should be handled in the actionPerformed method. However, going based on what you've presented to the community, here's something that should work;
if the names are case sensitive, your modification would be as such:
public SubmitButton(JTextField textfield){
nameInput = textfield;
if (nameInput.equals("InsertCaseSensitiveName")) {
//TODO: Verified Name
} else {
//TODO: Unverified Name
}
}
if case insensitive:
public SubmitButton(JTextField textfield){
nameInput = textfield;
if (nameInput.equalsIgnoreCase("InsertCaseSensitiveName")) {
//TODO: Verified Name
} else {
//TODO: Unverified Name
}
}
To use a list:
//initialize your list (formed so backwards compatible)
List<String> valid = new java.util.concurrent.CopyOnWriteArrayList<String>();
//Within a function, add all names to the list in lowercase (java.lang.String.toLowerCase())
public SubmitButton(JTextField textfield){
nameInput = textfield;
if (valid.contains(nameInput.toLowerCase()) {
//TODO: Verified Name
} else {
//TODO: Unverified Name
}
}
References:
conditional if statements
java.lang.String.equals
java.lang.String.equalsIgnoreCase
java.lang.String.toLowerCase
java.util.List
java.util.concurrent.CopyOnWriteArrayList
The actionPerformed method is called after clicking the submit button.
public void actionPerformed(ActionEvent submitClicked) {
Component frame = new JFrame();
JOptionPane.showMessageDialog(frame , "You've Submitted the name " + nameInput.getText() + " which is allowed.");
// You can store the value of whatever the user enters.
String inputName = nameInput.getText();
// And add the if statements:
if(inputName.equals("John") {
JOptionPane.showMessageDialog(frame, "Verified");
}
}
Alternatively you can create a List of Strings that contains all the names that is accepted. Example:
List<String> acceptedNames = Arrays.asList(new String[]{"John", "Jane"});
// and check
if acceptedNames.contains(inputName) {
// verified.
}

Needing to return value from user input

a basic problem that i can't figure out, tried a lot of things and can't get it to work, i need to be able to get the value/text of the variable
String input;
so that i can use it again in a different class in order to do an if statement based upon the result
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
public class pInterface extends JFrame {
String input;
private JTextField item1;
public pInterface() {
super("PAnnalyser");
setLayout(new FlowLayout());
item1 = new JTextField("enter text here", 10);
add(item1);
myhandler handler = new myhandler();
item1.addActionListener(handler);
System.out.println();
}
public class myhandler implements ActionListener {
// class that is going to handle the events
public void actionPerformed(ActionEvent event) {
// set the variable equal to empty
if (event.getSource() == item1)// find value in box number 1
input = String.format("%s", event.getActionCommand());
}
public String userValue(String input) {
return input;
}
}
}
You could display the window as a modal JDialog, not a JFrame and place the obtained String into a private field that can be accessed via a getter method. Then the calling code can easily obtain the String and use it. Note that there's no need for a separate String field, which you've called "input", since we can easily and simply extract a String directly from the JTextField (in our "getter" method).
For example:
import java.awt.Dialog.ModalityType;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import javax.swing.*;
import javax.swing.text.JTextComponent;
public class TestPInterface {
#SuppressWarnings("serial")
private static void createAndShowGui() {
final JFrame frame = new JFrame("TestPInterface");
// JDialog to hold our JPanel
final JDialog pInterestDialog = new JDialog(frame, "PInterest",
ModalityType.APPLICATION_MODAL);
final MyPInterface myPInterface = new MyPInterface();
// add JPanel to dialog
pInterestDialog.add(myPInterface);
pInterestDialog.pack();
pInterestDialog.setLocationByPlatform(true);
final JTextField textField = new JTextField(10);
textField.setEditable(false);
textField.setFocusable(false);
JPanel mainPanel = new JPanel();
mainPanel.add(textField);
mainPanel.add(new JButton(new AbstractAction("Get Input") {
#Override
public void actionPerformed(ActionEvent e) {
// show dialog
pInterestDialog.setVisible(true);
// dialog has returned, and so now extract Text
textField.setText(myPInterface.getText());
}
}));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
// by making the class a JPanel, you can put it anywhere you want
// in a JFrame, a JDialog, a JOptionPane, another JPanel
#SuppressWarnings("serial")
class MyPInterface extends JPanel {
// no need for a String field since we can
// get our Strings directly from the JTextField
private JTextField textField = new JTextField(10);
public MyPInterface() {
textField.addFocusListener(new FocusAdapter() {
#Override
public void focusGained(FocusEvent e) {
JTextComponent textComp = (JTextComponent) e.getSource();
textComp.selectAll();
}
});
add(new JLabel("Enter Text Here:"));
add(textField);
textField.addActionListener(new ActionListener() {
#Override
public void actionPerformed(ActionEvent e) {
Window win = (Window) SwingUtilities.getWindowAncestor(MyPInterface.this);
win.dispose();
}
});
}
public String getText() {
return textField.getText();
}
}
A Good way of doing this is use Callback mechanism.
I have already posted an answer in the same context.
Please find it here JFrame in separate class, what about the ActionListener?.
Your method is a bit confusing:
public String userValue(String input) {
return input;
}
I guess you want to do something like this:
public String getInput() {
return input;
}
public void setInput(String input) {
this.input = input;
}
Also your JFrame is not visible yet. Set the visibility like this setVisible(true)

Categories

Resources