The JScrollPane of the JTextArea is not working; Won't Scroll - java

I am a novice programmer in Java Swing. I am trying to make a JScrollPane with the JTextarea so that the text will scroll. But the scroll is not working. Please help me with this. I don't know what I am doing wrong. I am providing my code snippet here.
JTextArea ta = new JTextArea("Hello.\n \n \n \n \n There.", 5, 10);
ta.setBounds(250, 60, 120, 60);
JScrollPane jp = new JScrollPane(ta,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
jp.setBounds(250, 60, 140, 80);
jp.setPreferredSize(new Dimension(150, 150));
//jp.setViewportView(ta);
ta.setLineWrap(true);
panel.add(ta);
panel.add(jp);

By removing the below line:
panel.add(ta);
This will solve your problem since you are already adding the JTextArea to the JScrollPane
(Also the other comments are worth looking at :) )

Related

JScrollPane in Java

I wrote a little code to see how the scroll Pane functions but my code never worked.
here's the code,
public Fenetre(){
this.setTitle("Data Simulator");
this.setSize(300, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
String hello = "hello";
int number = 69;
JPanel content = new JPanel();
content.setBackground(Color.LIGHT_GRAY);
//Box imad = Box.createHorizontalBox();
JTextArea textArea = new JTextArea(10, 10);
JLabel imad = new JLabel();
imad.setText(hello + " your favorite number is " + number + "\nRight?");
JScrollPane scrollPane = new JScrollPane();
setPreferredSize(new Dimension(450, 110));
scrollPane.setHorizontalScrollBarPolicy(HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane.setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setEnabled(true);
scrollPane.setWheelScrollingEnabled(true);
scrollPane.setViewportView(textArea);
scrollPane.setViewportView(imad);
add(scrollPane, BorderLayout.CENTER);
//---------------------------------------------
//On ajoute le conteneur
scrollPane.add(textArea);
scrollPane.add(imad);
content.add(textArea);
content.add(imad);
content.add(scrollPane);
this.setContentPane(content);
this.setVisible(true);
this.setResizable(false);
}
When I run it, I get a little window with the textArea and next to the text area a very little white square, which is the scrollpane i suppose because when I remove it from the code, this square disappears. When I write in the text area and exceed the window's dimension, I can't scroll vertically using the mouse wheel, and not horizontally at all. I saw many examples on internet and I can't understand why my code doesn't work??
Any help explaining how scrollpane works?
scrollPane.setViewportView(textArea);
scrollPane.setViewportView(imad);
Only one component can be added to the viewport of the scroll pane, so the label replaces the text area.
content.add(textArea);
content.add(imad);
A component can only have a single parent. The above code removes the label from the scrollpane, so nothing is now in the scrollpane.
Try something like:
JScrollPane = new JScrollPane( textArea );
JPanel content = new JPanel( new BorderLayout() );
content.add(scrollPane, BorderLayout.CENTER);
content.add(imad, BorderLayout.PAGE_END);
setContentPane( content );
For a better solution, start with the working example found in the Swing tutorial on How to Use Text Areas and then modify the code. This way you will start with a better structured program that follows Swing standards.

Make TextField normal size using LayoutManagers

In the image above, this is what my GUI looks like, i have a problem fixing up the textfield as it takes up the most percentage of space in my frame, and i want to correct the error I have.
I know layout managers is a pain in the ass, but does anyone know how i can make the text field smaller so that my frame looks nicer.
I am using jpanels to hold most of my components
Here is the necessary part of my code
panel1 = new JPanel();
panel1.setLayout(new GridLayout());
frame.getContentPane().add(panel1, BorderLayout.NORTH);
label2 = new JLabel("Score: " + score);
label2.setFont(new Font("SimSun", Font.BOLD, 22));
label2.setLocation(0,0);
label2.setSize(117,37);
panel1.add(label2);
label3 = new JLabel("Lives: " + lives);
label3.setFont(new Font("SimSun", Font.BOLD, 22));
label3.setLocation(0,70);
label3.setSize(105,49);
panel1.add(label3);
panel2 = new JPanel();
panel2.setLayout(new BorderLayout());
frame.getContentPane().add(panel2, BorderLayout.CENTER);
label1 = new JLabel(a +" + " +b);
label1.setFont(new Font("SimSun", Font.BOLD, 22));
label1.setHorizontalAlignment(SwingConstants.CENTER);
Border paddingBorder = BorderFactory.createEmptyBorder(10,10,10,10);
label1.setBorder(BorderFactory.createCompoundBorder(null,paddingBorder));
label1.setLocation(249,105);
label1.setSize(183,60);
panel2.add(label1, BorderLayout.NORTH);
box1 = new JTextField();
box1.setPreferredSize(new Dimension(50, 50));
box1.setLocation(249,176);
box1.setSize(96,25);
panel2.add(box1, BorderLayout.CENTER);
panel3 = new JPanel();
panel3.setLayout(new GridLayout());
frame.getContentPane().add(panel3, BorderLayout.SOUTH);
button1 = new JButton("Answer");
panel3.add(button1);
button1.addActionListener(this);
button1.setLocation(187,236);
button1.setSize(105,50);
button2 = new JButton("Reset");
panel3.add(button2);
button2.addActionListener(this);
button2.setVisible(false);
button2.setLocation(302,236);
button2.setSize(105,50);
The reason for this is you are adding your JTextField to BorderLayout.CENTER, which will stretch it to fill all the space available to this particular layout manager. Although I am not exactly sure how you want your GUI to look, perhaps a simple FlowLayout (the default layout) or a BoxLayout coupled with setAlignmentX(Component.CENTER_ALIGNMENT); on the JTextField will solve your problem.
You can find more information on layouts here: https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html
Additionally, note that you shouldn't be using things like setLocation() as the point of the layout manager is to allow it to choose how components should be laid out on the screen, and as such the layout manager may ignore this as well as methods like setSize.

Java: Can't apply Gridlayout to a Jscrollpane. Get Get java.lang.ClassCastException

I use a Gridlayout to place 4 elements in one Line. First I had a JPanel and everything worked fine. For the case that the number of lines get to big and I have to be able to scroll down, I changed it a bit. Now I have my JPanel with one JScrollPane added on it. I used the same code, now I just add the elements to the viewport of the Jscrollpane, but now I get this exception Get java.lang.ClassCastException: layout of JScrollPane must be a ScrollPaneLayout: at javax.swing.JScrollPane.setLayout(Unknown Source) and I dont know exactly why. Why shouldnt be Gridlayout's be unknown for Jscrollpane?
Here is the code:
public objectDetails() {
setTitle("LLI_MC_Solver");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
contentPane = new JPanel();
contentPane.setLayout(new GridLayout());
setBounds(100, 100, 510, 401);
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setVisible(true);
contentPane.setPreferredSize(new Dimension(500, 390));
JScrollPane scrollPane = new JScrollPane();
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setViewportBorder(new LineBorder(new Color(0, 0, 0), 2));
scrollPane.setBounds(10, 10, 474, 342);
scrollPane.setLayout(new GridLayout(0,4)); //Line which causes the error
scrollPane.setPreferredSize(new Dimension(465, 330));
contentPane.add(scrollPane);
JPanel view = (JPanel)scrollPane.getViewport().getView();
for(Values v : colDetails)
{
JLabel lblC = new JLabel();
lblC.setText(k);
view.add(lblC);
view.validate();
JLabel lblN = new JLabel();
lblN.setText(v.getName());
view.add(lblN);
view.validate();
JLabel lblT = new JLabel();
lblT.setText(v.getType());
view.add(lblT);
view.validate();
JTextField valueBox = new JTextField();
valueBox.setText(v.getValue());
view.add(valueBox);
view.validate();
}
}
I marked the line which causes the Problem according to the compiler. I dont understand why, with the JPanel the same code worked fine. The for-loop where the elements are added I posted for completion purposes, the issue must be somewhere in the setLayout()-Method.
Thanks in advance, appreciate every help.
scrollPane.setLayout(new GridLayout(0,4)); //Line which causes the error
You can't change the layout manager of a scrollpane.
A JScrollPane has its own custom layout manager because it needs to manage the horizontal/vertical scrollbars as well as the row/column headers etc..
Instead you add a panel that uses a GridLayout:
JPanel panel = new JPanel( new GridLayout(0, 4) );
panel.add( component1 );
panel.add( component2 );
panel.add( component3 );
panel.add( component4 );
JScrollPane = new JScrollPane( panel );

JtextPane doesn't show in JscrollPane

I have a textpane which I want to add to a JscrollPane. But I can't see the textpane. What is wrong here?
crimepanel.setBounds(new Rectangle(660, 250, 295, 35));
scroll.setBounds(new Rectangle(655, 240, 305, 55));
scroll.add(crimepanel);
this.getContentPane().add(scroll, null);
this.getContentPane().add(crimepanel, null);
I got it! Proper code is:
scroll.getViewport().add(crimepanel, null);
this.getContentPane().add(scroll, null);

JTextArea stretches when setWrapLine

I have the following code: the problem is that when i run the application, the JPanel containing those components stretches because of setLineWrap(true) I've inserted the JTextArea in a JScrollPane as suggested here
http://docs.oracle.com/javase/tutorial/uiswing/components/textarea.html
but with no result
titolo=new JLabel("title");
text=new JTextArea("");
scrollPane = new JScrollPane(text);
text.setLineWrap(true);
griglia=new GridBagLayout();
gbc=new GridBagConstraints();
setLayout(griglia);
buildConstraints(gbc,0,0,1,1,100,1);
griglia.setConstraints(titolo,gbc);
buildConstraints(gbc,0,1,1,1,100,100);
griglia.setConstraints(scrollPane,gbc);
add(titolo);
add(scrollPane);
Check GridBagConstraint here in the fill - The initial fill value use GridBagConstraints.NONE.

Categories