I have a JTextArea, and I want to add a JMenuBar to it, but it doesn't seem to work.
ta = new JTextArea();
ta.setBackground(Color.RED);
// ta.setLayout(null); I tried with a null layout and
non-null
pane = new JScrollPane(ta);
pane.setBounds(Main.WIDTH - (Main.WIDTH - 20), Main.HEIGHT - (Main.HEIGHT - 20), Main.WIDTH - 60, Main.HEIGHT - 500);
bar = new JMenuBar();
bar.setBounds(0, 0, ta.getWidth(), 20); // This won't be there if
// there is a non-null layout.
ta.add(bar); // I also tried pane.add(bar); that didn't work either.
Is there any way to add JMenuBar to JTextArea?
Put the JTextArea into a JScrollPane -- always
Add the JScrollPane to the BorderLayout.CENTER position of a JPanel that uses BorderLayout
Add the JMenuBar to the BorderLayout.PAGE_START position of the same BorderLayout using JPanel
Done
e.g.,
JTextArea ta = new JTextArea(40, 20); // give columns and rows
JScrollPane scrollPane = new JScrollPane(ta);
JPanel borderLayoutPanel = new JPanel(new BorderLayout());
borderLayoutPanel.add(scrollPane, BorderLayout.CENTER);
JMenuBar menuBar = new JMenuBar();
// add menu's to the menu bar here
borderLayoutPanel.add(menuBar, BorderLayout.PAGE_START);
Side notes:
The code where you call, ta.getWidth() is likely returning a width value of 0, since it appears to be called before the JTextArea has been rendered.
You almost never want to add components directly to the JTextArea itself as that potentially interferes with the functioning of the text area.
Related
So I have a problem that I have to make a questionnaire about something and I have to use multiple Layouts.
My problem is that when I add 2 JPanels to a Grid layout (only to 1 side) my first Panel takes up most of the space.
Code:
public class MainFrame extends JFrame implements ItemListener{
JPanel mainPanel,rightSideAge,rightSideGender,leftSide,rightSideBox,leftSideBox;
JTextArea nameArea;
JSpinner ageSpinner;
JRadioButton genMale,genFema;
ButtonGroup genderGroup;
MainFrame(){
this.setSize(1000, 800);
this.setLocationRelativeTo(null);
this.setTitle("Közvélemény kutatás a zenei ízlésekről");
mainPanel = new JPanel(new GridLayout(0, 2));
this.setContentPane(mainPanel);
/* --- RIGHT PANEL --- */
rightSideBox = new JPanel();
rightSideBox.setLayout(new BoxLayout(rightSideBox, BoxLayout.Y_AXIS));
rightSideAge = new JPanel(new FlowLayout(FlowLayout.LEFT));
rightSideAge.setBorder(BorderFactory.createLineBorder(Color.BLUE));
//rightSide.setLayout(new BoxLayout(rightSide, BoxLayout.Y_AXIS));
mainPanel.add(rightSideBox);
//Age label
//JLabel labelAge = new JLabel("Kor: ");
//labelAge.setSize(100, 30);
//Age Spinner
ageSpinner = new JSpinner(new SpinnerNumberModel(1, 1, 120, 1));
ageSpinner.setPreferredSize(new Dimension(40, 20));
Component mySpinnerEditor = ageSpinner.getEditor();
JFormattedTextField jftf = ((JSpinner.DefaultEditor) mySpinnerEditor).getTextField();
jftf.setColumns(5);
//New box for zenei ízlés
rightSideGender = new JPanel();
rightSideGender.setBorder(BorderFactory.createLineBorder(Color.GREEN));
rightSideGender.setLayout(new BoxLayout(rightSideGender,BoxLayout.Y_AXIS));
//Gender ComboBox
genderGroup = new ButtonGroup();
genMale = new JRadioButton("Férfi");
genderGroup.add(genMale);
genFema = new JRadioButton("Nő");
genderGroup.add(genFema);
/* --- LEFT SIDE --- */
rightSideBox.setBorder(BorderFactory.createLineBorder(Color.RED));
/* ADD STUFF TO PANELS */
/* RightSideBox */
rightSideBox.add(rightSideAge);
rightSideBox.add(rightSideGender);
/*RIGHT SIDE PANELS*/
rightSideGender.add(new JLabel("Nem:"));
rightSideGender.add(genMale);
rightSideGender.add(genFema);
rightSideAge.add(new JLabel("Kor"));
//rightSide.add(labelAge);
rightSideAge.add(ageSpinner);
/*LEFT SIDE PANEL*/
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
The Blue lineout sould be only under the JSpinner:
ageSpinner.setPreferredSize(new Dimension(40, 20));
First of all, you should not be manually setting the size of a component. Each Swing component is responsible for determining its own size.
The Blue lineout should be only under the JSpinner:
The box layout will resize a component to its maximum size if there is space available. For some reason a JSpinner doesn't appear to have a maximum height so it expands to fill all the available space.
To fix this you can do something like:
//ageSpinner.setPreferredSize(new Dimension(40, 20));
ageSpinner.setMaximumSize( ageSpinner.getPreferredSize() );
mainPanel layout is set to have two columns:
mainPanel = new JPanel(new GridLayout(0, 2));
You only add one panel to mainPanel which uses the GridLayout:
mainPanel.add(rightSideBox);
Note: the first component you add, in this case rightSideBox will occupy the first column, meaning it will be the LEFT one.
To add rightSideGender to mainPanel you need to :
mainPanel.add(rightSideGender);
The second component you add, in this case rightSideGender will occupy the second column, in this case the RIGHT one.
I have a JScrollPane processesScrollPane which has a JPanel processButtonPanel as component. Now in this component I add JButtons which come from an ArrayList I fill up while the programming is running.
I've set some settings of the JScrollPane, but the problem I'm having is that when there are more buttons in the JPanel then I can display, the JScrollPane isn't enabling its scrollbars.
Here some code snippets:
processesScrollPane = new JScrollPane();
processesScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
processesScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
processesScrollPane.setBounds(12, 42, 221, 380);
processPanel.add(processesScrollPane); //processPanel is the JPanel which holds the JScrollPane
processButtonPanel = new JPanel(); // here are the buttons added whenever they are made and placed in the buttonList
processesScrollPane.setViewportView(processButtonPanel);
processButtonPanel.setLayout(null);
processesScrollPane.setViewportView(processButtonPanel);
buttonList = new ArrayList<JButton>();
and the code where I'm making the buttons:
JButton b = new JButton("Process " + i);
b.setBounds(12, 5 + (30*i), 174, 25);
processButtonPanel.add(b);
processButtonPanel.repaint();
buttonList.add(b);
processesScrollPane.revalidate();
processesScrollPane.repaint();
(Yes I'm using no layout, but that's because I'm not going to scale the whole window etc)
Can anyone help me with the enabling of the scrollBars at the right time?
I have a panel which is divided by two parts with BoxLayout.X_AXIS:
public TabsPanel() {
setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
add(createLeftPanel());
add(createRightPanel());
}
Each left and right panels have the following structure: an outer panel with BorderLayout, and an inner panel in BorderLayout.CENTER of the outer panel, which in its turn has BoxLayout.Y_AXIS and several components from top to bottom. The right panel has JTextArea with JScrollPane as one of its components:
protected JPanel createRightPanel() {
JPanel pane = new JPanel();
pane.setLayout(new BorderLayout());
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
JTextArea label = createLabel();
JScrollPane scroll = new JScrollPane(label);
scroll.setMaximumSize(new Dimension(500, 200));
panel.add(Box.createRigidArea(new Dimension(0,106)));
panel.add(scroll);
JPanel panel_buttons = new JPanel();
panel_buttons.setLayout(new BoxLayout(panel_buttons, BoxLayout.LINE_AXIS));
panel_buttons.setAlignmentX(Component.CENTER_ALIGNMENT);
Font font_text = new Font("Georgia", Font.PLAIN, 20);
JButton[] buttons = new JButton[2];
buttons[0] = new JButton("Clear");
buttons[1] = new JButton("Exit");
for (int i = 0; i < buttons.length; i++) {
buttons[i].setMaximumSize(new Dimension(120, 40));
buttons[i].setFont(font_text);
panel_buttons.add(buttons[i]);
if (i == 0)
panel_buttons.add(Box.createRigidArea(new Dimension(40, 0)));
buttons[i].addActionListener(new TextActionListener(label));
}
panel.add(Box.createRigidArea(new Dimension(0,20)));
panel.add(panel_buttons);
pane.add(panel, BorderLayout.CENTER);
return pane;
}
When text goes beyond the borders, scroll bars appear and I can move them and read the text. Looks like everything is ok, but when I either click any place outside the scroll pane or even just move the pointer, the scroll pane moves to the left and grows down. It doesn't change its width, but it shifts to the left because the area between it and the right panel's borders increases. Accordingly, size of the left panel shrinks. When I clear the text area and again either click or move the pointer, it is back to its normal size.
What is the reason its height grows and its left and right margins increase? What am I doing wrong?
UPDATE. I've found the problem. The thing is that I didn't create JTextArea correctly. I initialized it without parameters:
JTextArea text = new JTextArea("Some initial text");
Now I have rewritten:
JTextArea text = new JTextArea(5,10);
It is now shifted to the left by about 5 mm and do not changes its height. Still not perfect, but looks like I am on the right track.
Thank you everybody for your help!
BoxLayout accepting Min, Max and PreferredSize override those methods for JPanel
use JSPlitPane, there you can to hide Divider
2 steps to correct:
Set the size of the JTextArea: JTextArea text = new JTextArea(row, col);
Still shifts to the left by the size of the vertical bar:
either add ChangeListener to adjust the size of the JScrollPane
scroll.getViewport().addChangeListener(new ChangeListener() {
#Override
public void stateChanged(ChangeEvent e) {
if (scroll.getVerticalScrollBar().isVisible())
scroll.setPreferredSize(480, 200);
}
}
});
or add scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
I am making KenKen as my term project using java swing library. For alignment I have used gridbag and gridlayout, But now i want to add one more component of JPanel to the UI. These screenshots will make the problem more clear:
Now I select the grid cell to which i want to add respective candidates of in the left most panel.
It disturbs the adjacent alignments of the grid and panels.
Here are the panels with their respective layouts:
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(1, 4, 5, 5));
buttonPanel.setPreferredSize(new Dimension(20,40));
buttonPanel.add(undoButton);
buttonPanel.add(redoButton);
buttonPanel.add(eraseButton);
buttonPanel.add(hintButton);
JPanel cellPanel = new JPanel();
cellPanel.setName("cellPanel");
cellPanel.setLayout(new GridLayout(pSize, pSize, 0, 0));
JPanel numPanel = new JPanel();
numPanel.setName("numPanel");
numPanel.setLayout(new GridLayout(1,1,5,5));
numPanel.setPreferredSize((new Dimension(50,60)));
JPanel candPanel = new JPanel();
candPanel.setName("candidatesPanel");
JLabel candidates = new JLabel("Candidates");
candidates.setFont(new Font("Courier New", Font.ITALIC, 14));
candidates.setForeground(Color.GRAY);
candPanel.setLayout(new GridLayout(0,1));
candPanel.add(candidates);
Then it all goes into the content panel:
content.add(buttonPanel, pos.nextCol().expandW());
content.add(candPanel, pos.nextRow());
content.add(new Gap(GAP) , pos.nextRow()); // Add a gap below
content.add(cellPanel, pos.nextCol());
content.add(numPanel,pos.nextCol().expandW());
The buttons are all generated on runtime, and they are added to the candPanel in an action listener.
You appear to be using a GridBagConstraints subclass of which I am unaware (variable pos), though I can guess its function from context.
Assuming your problem is that you want the candidates panel to be to the left of the cellPanel, and not above it, you need to swap the lines which add the candPanel and the new Gap(GAP) as follows:
content.add(buttonPanel, pos.nextCol().expandW());
content.add(new Gap(GAP), pos.nextRow()); // These two lines
content.add(candPanel, pos.nextRow()); // swapped over
content.add(cellPanel, pos.nextCol());
content.add(numPanel,pos.nextCol().expandW());
I have a JTextArea inside of a JPanel that is then placed into the JScrollPane. When the JPanel that contains the JScrollPane is first show the JScrollPane shows up but not the contents. As soon as the JFrame is resized the contents show up.
JTextArea area = new JTextArea(6, 20);
area.setText("Some test text");
JPanel panel = new JPanel(new BorderLayout());
panel.add(area, BorderLayout.CENTER);
JScrollPane pane = new JScrollPane();
pane.setBounds(20, 20, WIDTH - 40, 300 - 40);
pane.setPreferredSize(new Dimension(WIDTH - 40, 300 - 40));
add(pane);
pane.setViewportView(panel);
pane.setBounds(20, 20, WIDTH - 40, 300 - 40);
pane.setPreferredSize(new Dimension(WIDTH - 40, 300 - 40));
Those two lines of code doen't make sense (although they are not the cause of your problem)
The first line is used when you are using a "null layout".
The second is used when you are using layout managers.
They should not be used together.
The second is preferred since you should be using layout managers.
In the application different JPanels are swapped out in a manner similar to a slide-show. So something like this would be found in the code:
panel.remove(slide1);
panel.add(slide2);
panel.repaint();
The problem being that all of the contents of the second slide, slide2, would not show up. The solution is to add
frame.validate();
Where frame is the parent window of panel.
new JScrollPane(panel);
I believe that you need to add the panel to the scroll pane constructor.