我一直在努力创建一个基于java swing的应用程序,通过使用twitter4j从用户检索推文。代码似乎在假装在控制台但没有添加时工作..我试过添加滚动区域并滚动条以帮助文本换行和更长的文本,但它似乎无法正常工作..
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");
}
}
}
}
答案 0 :(得分:0)
我认为您的主要问题是您使用null布局,并且您需要选择mainFrame
和面板中每个组件的大小和位置。在我看来是非常糟糕的主意,一般不推荐。使用BorderLayout
JFrame
和JPanels
的其他内容编写它会更简单。但这取决于你。
在这种特殊情况下,我认为你的scrollArea
无效,因为:
userInfo
两次,首先添加到scrollArea
,然后直接添加到tPanel
。因此,您在运行程序时看到的是userInfo
中的tPanel
,因为组件只能添加到一个容器中。setBounds()
都是必要的,但setBounds()
没有scrollArea
。这是使其发挥作用的最快捷方式:
删除行tPanel.add(userInfo);
,
更改scrollArea.setBounds(0,34,700,260);
的{{1}} - 只需更改后备的组件就足够了,
在这些改变之后它应该有效。
有条件的评论:
userInfo.setBounds(0,34,700,260);
添加到JScrollBar
,它自己拥有它,JScrollPane
行不起作用,因为mainFrame.setLocationByPlatform(true);
手动setLocation()
并使用空布局,mainFrame
两次,可以删除一行