ScrollArea 和 ScrollBar 不工作
ScrollArea and ScrollBar not working
我一直在尝试制作一个基于 java swing 的应用程序,以通过使用 twitter4j 从用户那里检索推文。当假装在控制台上但没有添加 ..i 时,代码似乎可以正常工作我试过添加滚动区和滚动条来帮助文本换行和更长的文本,但它似乎不起作用..
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import twitter4j.*;
import twitter4j.auth.AccessToken;
import twitter4j.conf.ConfigurationBuilder;
public class mainTwitter {
public static void main(String args[])
{
List<Status> statuses=null;
String user;
try{
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true)
.setOAuthConsumerKey("*************")
.setOAuthConsumerSecret("*************")
.setOAuthAccessToken("*************")
.setOAuthAccessTokenSecret("*************");
TwitterFactory tf = new TwitterFactory(cb.build());
Twitter twitter = tf.getInstance();
if(args.length==1)
{
user=args[0];
statuses=twitter.getUserTimeline(user);
}
else
{
user = twitter.verifyCredentials().getScreenName();
statuses = twitter.getUserTimeline();
}
System.out.println("Showing "+user+"'s user timeline.");
/*
for(Status status: statuses)
{
System.out.println("@"+status.getUser().getScreenName()+"-"+status.getText());
}*/
}
catch(Exception e)
{
e.printStackTrace();
}
JFrame mainFrame = new JFrame("Twitter Montior");
mainFrame.setLocationByPlatform(true);
mainFrame.setLocation(360, 80);
JPanel tPanel = new JPanel();
JPanel bPanel = new JPanel();
mainFrame.setLayout(null);
///////////////////////////////////////////////////////////////////////////////
//Top Panel
JTextField t1 = new JTextField("Twitter Monitor!!");
t1.setBackground(Color.yellow);
t1.setHorizontalAlignment(JTextField.CENTER);
t1.setEditable(false);
Font new_f = new Font("Serif", Font.PLAIN, 30);
t1.setFont(new_f);
JTextArea userInfo=new JTextArea();
Font font2 = new Font("Serif", Font.PLAIN, 20);
userInfo.setFont(font2);
userInfo.setLineWrap(true);
userInfo.setWrapStyleWord(true);
userInfo.setBackground(Color.LIGHT_GRAY);
userInfo.setEditable(false);
userInfo.setLineWrap(true);
JScrollPane scrollArea = new JScrollPane(userInfo);
scrollArea.setVerticalScrollBarPolicy(
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
JScrollBar bar = new JScrollBar();
scrollArea.add(bar);
tPanel.add(scrollArea);
JButton retrieve = new JButton("Click");
tPanel.setLayout(null);
t1.setBounds(150, 2, 250, 30);
userInfo.setBounds(0,34,700,260);
retrieve.setBounds(260, 300, 50, 20);
tPanel.add(retrieve);
tPanel.add(t1);
tPanel.add(userInfo);
///////////////////////////////////////////////////////////////////////////////
///Bottom Panel..
///////////////////////////////////////////////////////////////////////////////
tPanel.setBounds(0, 0, 700, 350);
bPanel.setBounds(0,352,700,248);
handler h = new handler(statuses, userInfo);
retrieve.addActionListener(h);
mainFrame.add(tPanel);
mainFrame.add(bPanel);
mainFrame.setSize(700, 600);
mainFrame.setResizable(false);
mainFrame.setVisible(true);
}
}
class handler implements ActionListener
{
List<Status> statuses2;
JTextArea t;
handler(List<Status> statuses1, JTextArea f)
{
statuses2=statuses1;
t=f;
}
@Override
public void actionPerformed(ActionEvent e) {
String s = e.getActionCommand();
if(s=="Click")
{
for(Status status: statuses2)
{
System.out.println("@"+status.getUser().getScreenName()+"-"+status.getText());
t.setText("@"+status.getUser().getScreenName()+"-"+status.getText());
t.setText("\n");
}
}
}
}
我认为您的主要问题是您使用了空布局,并且您需要选择 mainFrame
和面板中每个组件的大小和位置。在我看来这是一个非常糟糕的主意,一般不推荐。将 BorderLayout
用于 JFrame
并使用其他用于 JPanels
来编写它会简单得多。但这取决于你。
在这种特殊情况下,我认为您的 scrollArea
无法正常工作,因为:
- 你加了两次
userInfo
,第一次加到scrollArea
,然后直接加到tPanel
。所以你在 运行 程序中看到的是 userInfo
in tPanel
,因为组件只能添加到一个容器中。
- 您使用了空布局,因此有必要为具有此类布局设置的容器内的每个组件
setBounds()
,但您没有 setBounds()
scrollArea
。
所以让它工作的最快方法:
删除行tPanel.add(userInfo);
,
将 scrollArea.setBounds(0,34,700,260);
更改为 userInfo.setBounds(0,34,700,260);
- 更改其相关的组件就足够了,
经过这些更改后它应该可以工作。
补充说明:
- 你不需要在
JScrollPane
上加上JScrollBar
,它自己就有了,
mainFrame.setLocationByPlatform(true);
行不工作并且没有必要,因为您手动 mainFrame
的 setLocation()
并使用空布局,
- 你用了
userInfo.setLineWrap(true);
两次,你可以删除一行,
我一直在尝试制作一个基于 java swing 的应用程序,以通过使用 twitter4j 从用户那里检索推文。当假装在控制台上但没有添加 ..i 时,代码似乎可以正常工作我试过添加滚动区和滚动条来帮助文本换行和更长的文本,但它似乎不起作用..
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import twitter4j.*;
import twitter4j.auth.AccessToken;
import twitter4j.conf.ConfigurationBuilder;
public class mainTwitter {
public static void main(String args[])
{
List<Status> statuses=null;
String user;
try{
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true)
.setOAuthConsumerKey("*************")
.setOAuthConsumerSecret("*************")
.setOAuthAccessToken("*************")
.setOAuthAccessTokenSecret("*************");
TwitterFactory tf = new TwitterFactory(cb.build());
Twitter twitter = tf.getInstance();
if(args.length==1)
{
user=args[0];
statuses=twitter.getUserTimeline(user);
}
else
{
user = twitter.verifyCredentials().getScreenName();
statuses = twitter.getUserTimeline();
}
System.out.println("Showing "+user+"'s user timeline.");
/*
for(Status status: statuses)
{
System.out.println("@"+status.getUser().getScreenName()+"-"+status.getText());
}*/
}
catch(Exception e)
{
e.printStackTrace();
}
JFrame mainFrame = new JFrame("Twitter Montior");
mainFrame.setLocationByPlatform(true);
mainFrame.setLocation(360, 80);
JPanel tPanel = new JPanel();
JPanel bPanel = new JPanel();
mainFrame.setLayout(null);
///////////////////////////////////////////////////////////////////////////////
//Top Panel
JTextField t1 = new JTextField("Twitter Monitor!!");
t1.setBackground(Color.yellow);
t1.setHorizontalAlignment(JTextField.CENTER);
t1.setEditable(false);
Font new_f = new Font("Serif", Font.PLAIN, 30);
t1.setFont(new_f);
JTextArea userInfo=new JTextArea();
Font font2 = new Font("Serif", Font.PLAIN, 20);
userInfo.setFont(font2);
userInfo.setLineWrap(true);
userInfo.setWrapStyleWord(true);
userInfo.setBackground(Color.LIGHT_GRAY);
userInfo.setEditable(false);
userInfo.setLineWrap(true);
JScrollPane scrollArea = new JScrollPane(userInfo);
scrollArea.setVerticalScrollBarPolicy(
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
JScrollBar bar = new JScrollBar();
scrollArea.add(bar);
tPanel.add(scrollArea);
JButton retrieve = new JButton("Click");
tPanel.setLayout(null);
t1.setBounds(150, 2, 250, 30);
userInfo.setBounds(0,34,700,260);
retrieve.setBounds(260, 300, 50, 20);
tPanel.add(retrieve);
tPanel.add(t1);
tPanel.add(userInfo);
///////////////////////////////////////////////////////////////////////////////
///Bottom Panel..
///////////////////////////////////////////////////////////////////////////////
tPanel.setBounds(0, 0, 700, 350);
bPanel.setBounds(0,352,700,248);
handler h = new handler(statuses, userInfo);
retrieve.addActionListener(h);
mainFrame.add(tPanel);
mainFrame.add(bPanel);
mainFrame.setSize(700, 600);
mainFrame.setResizable(false);
mainFrame.setVisible(true);
}
}
class handler implements ActionListener
{
List<Status> statuses2;
JTextArea t;
handler(List<Status> statuses1, JTextArea f)
{
statuses2=statuses1;
t=f;
}
@Override
public void actionPerformed(ActionEvent e) {
String s = e.getActionCommand();
if(s=="Click")
{
for(Status status: statuses2)
{
System.out.println("@"+status.getUser().getScreenName()+"-"+status.getText());
t.setText("@"+status.getUser().getScreenName()+"-"+status.getText());
t.setText("\n");
}
}
}
}
我认为您的主要问题是您使用了空布局,并且您需要选择 mainFrame
和面板中每个组件的大小和位置。在我看来这是一个非常糟糕的主意,一般不推荐。将 BorderLayout
用于 JFrame
并使用其他用于 JPanels
来编写它会简单得多。但这取决于你。
在这种特殊情况下,我认为您的 scrollArea
无法正常工作,因为:
- 你加了两次
userInfo
,第一次加到scrollArea
,然后直接加到tPanel
。所以你在 运行 程序中看到的是userInfo
intPanel
,因为组件只能添加到一个容器中。 - 您使用了空布局,因此有必要为具有此类布局设置的容器内的每个组件
setBounds()
,但您没有setBounds()
scrollArea
。
所以让它工作的最快方法:
删除行
tPanel.add(userInfo);
,将
scrollArea.setBounds(0,34,700,260);
更改为userInfo.setBounds(0,34,700,260);
- 更改其相关的组件就足够了,
经过这些更改后它应该可以工作。
补充说明:
- 你不需要在
JScrollPane
上加上JScrollBar
,它自己就有了, mainFrame.setLocationByPlatform(true);
行不工作并且没有必要,因为您手动mainFrame
的setLocation()
并使用空布局,- 你用了
userInfo.setLineWrap(true);
两次,你可以删除一行,