ScrollArea和ScrollBar无法正常工作

时间:2015-05-18 12:49:05

标签: java twitter twitter4j

我一直在努力创建一个基于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");

            }
        }



    }





}

1 个答案:

答案 0 :(得分:0)

我认为您的主要问题是您使用null布局,并且您需要选择mainFrame和面板中每个组件的大小和位置。在我看来是非常糟糕的主意,一般不推荐。使用BorderLayout JFrameJPanels的其他内容编写它会更简单。但这取决于你。

在这种特殊情况下,我认为你的scrollArea无效,因为:

  1. 您添加userInfo两次,首先添加到scrollArea,然后直接添加到tPanel。因此,您在运行程序时看到的是userInfo中的tPanel,因为组件只能添加到一个容器中。
  2. 您使用空布局,因此对于具有此类布局设置的容器内的每个组件,setBounds()都是必要的,但setBounds()没有scrollArea
  3. 这是使其发挥作用的最快捷方式:

    • 删除行tPanel.add(userInfo);

    • 更改scrollArea.setBounds(0,34,700,260);的{​​{1}} - 只需更改后备的组件就足够了,

    在这些改变之后它应该有效。

    有条件的评论:

    • 您不需要将userInfo.setBounds(0,34,700,260);添加到JScrollBar,它自己拥有它,
    • JScrollPane行不起作用,因为mainFrame.setLocationByPlatform(true);手动setLocation()并使用空布局,
    • 您使用mainFrame两次,可以删除一行