GVKun编程网logo

从JButton显示/隐藏JPopupMenu;FocusListener无法正常工作?(button隐藏不可见)

16

以上就是给各位分享从JButton显示/隐藏JPopupMenu;FocusListener无法正常工作?,其中也会对button隐藏不可见进行解释,同时本文还将给你拓展Androiddrawable

以上就是给各位分享从JButton显示/隐藏JPopupMenu;FocusListener无法正常工作?,其中也会对button隐藏不可见进行解释,同时本文还将给你拓展Android drawable ic_menu_star无法正常工作?、Android listfragment onItemClick无法正常工作?、Android ScaleListener无法正常工作、android – ListView setOnItemClickListener无法正常工作等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

从JButton显示/隐藏JPopupMenu;FocusListener无法正常工作?(button隐藏不可见)

从JButton显示/隐藏JPopupMenu;FocusListener无法正常工作?(button隐藏不可见)

我需要一个带有附加的下拉样式菜单的JButton。因此,我采用了JPopupMenu并将其附加到JButton上,就像在下面的代码中看到的那样。它需要做的是:

  • 单击时显示弹出窗口
  • 如果第二次单击则将其隐藏
  • 如果在弹出窗口中选择了一项,则将其隐藏
  • 如果用户单击屏幕上的其他位置,则将其隐藏

这4种方法都可以使用,但是由于我使用的是boolean标志,如果用户单击其他位置或选择了一个项目,则必须在该按钮上再次单击两次才能再次显示它。这就是为什么我尝试添加一个FocusListener(它绝对没有响应)来解决此问题,并在这种情况下将标志设置为false的原因。

编辑:在答案中的最后尝试…

这里是侦听器:(它在扩展JButton的类中,因此第二个侦听器在JButton上。)

// Show popup on left click.menu.addFocusListener(new FocusListener() { @Override public void focusLost(FocusEvent e) {  System.out.println("LOST FOCUS");  isShowingPopup = false; } @Override public void focusGained(FocusEvent e) {  System.out.println("GAINED FOCUS"); }});addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) {  System.out.println("isShowingPopup: " + isShowingPopup);  if (isShowingPopup) {   isShowingPopup = false;  } else {   Component c = (Component) e.getSource();   menu.show(c, -1, c.getHeight());   isShowingPopup = true;  } }});

我已经为此打了太久了。如果有人可以告诉我这是怎么回事,那太好了!

谢谢!

码:

public class Button extends JButton {    // Icon.    private static final ImageIcon ARROW_SOUTH = new ImageIcon("ArrowSouth.png");    // Unit popup menu.    private final JPopupMenu menu;    // Is the popup showing or not?    private boolean isShowingPopup = false;    public Button(int height) {        super(ARROW_SOUTH);        menu = new JPopupMenu(); // menu is populated somewhere else        // FocusListener on the JPopupMenu        menu.addFocusListener(new FocusListener() {            @Override            public void focusLost(FocusEvent e) {                System.out.println("LOST FOCUS");                isShowingPopup = false;            }            @Override            public void focusGained(FocusEvent e) {                System.out.println("GAINED FOCUS");            }        });        // ComponentListener on the JPopupMenu        menu.addComponentListener(new ComponentListener() {            @Override            public void componentShown(ComponentEvent e) {                System.out.println("SHOWN");            }            @Override            public void componentResized(ComponentEvent e) {                System.out.println("RESIZED");            }            @Override            public void componentMoved(ComponentEvent e) {                System.out.println("MOVED");            }            @Override            public void componentHidden(ComponentEvent e) {                System.out.println("HIDDEN");            }        });        // ActionListener on the JButton        addActionListener(new ActionListener() {            @Override            public void actionPerformed(ActionEvent e) {                System.out.println("isShowingPopup: " + isShowingPopup);                if (isShowingPopup) {                    menu.requestFocus();                    isShowingPopup = false;                } else {                    Component c = (Component) e.getSource();                    menu.show(c, -1, c.getHeight());                    isShowingPopup = true;                }            }        });        // Skip when navigating with TAB.        setFocusable(true); // Was false first and should be false in the end.        menu.setFocusable(true);    }}

答案1

小编典典

这是另一种方法,即使不是很优雅,也算是不错的,据我所知,它是可行的。首先,在最顶部,我添加了一个名为的第二个布尔值showPopup

FocusListener必须如下:

    menu.addFocusListener(new FocusListener() {        @Override        public void focusLost(FocusEvent e) {            System.out.println("LOST FOCUS");            isShowingPopup = false;        }        @Override        public void focusGained(FocusEvent e) {            System.out.println("GAINED FOCUS");            isShowingPopup = true;        }    });

isShowingPopup布尔没有得到改变其他地方-如果它获得焦点,它假定它表示,如果它失去焦点,它假定它不是。

接下来,ActionListener按钮上的有所不同:

   addActionListener(new ActionListener() {        @Override        public void actionPerformed(ActionEvent e) {            System.out.println("isShowingPopup: " + isShowingPopup);            if (showPopup) {                Component c = (Component) e.getSource();                menu.show(c, -1, c.getHeight());                menu.requestFocus();            } else {                showPopup = true;            }        }    });

现在出现了真正的新东西。这是一个MouseListener按钮:

    addMouseListener(new MouseAdapter() {        @Override        public void mousePressed(MouseEvent e) {            System.out.println("ispopup?: " + isShowingPopup);            if (isShowingPopup) {                showPopup = false;            }        }        @Override        public void mouseReleased(MouseEvent e) {            showPopup = true;        }    });

基本上,mousePressed在菜单失去焦点之前被调用,因此isShowingPopup反映了是否在按下按钮之前显示了弹出窗口。然后,如果菜单在那里,我们将其设置showPopupfalse,这样该actionPerformed方法在调用菜单后(放开鼠标后)就不会显示菜单。

在每种情况下,它的行为均符合预期,但只有一种:如果显示菜单,并且用户在按钮上按下鼠标但将其释放到按钮外,actionPerformed则永远不会调用。这意味着它showPopup仍然为假,并且下次按下该按钮时不会显示菜单。要解决此问题,mouseReleased方法将重置showPopup。据我所知,该mouseReleased方法在after之后被调用actionPerformed

我在结果按钮上玩了一点,对按钮做了所有我想得到的事情,并且按预期工作。但是,我不是100%肯定事件将始终以相同的顺序发生。

最终,我认为这至少值得一试。

Android drawable ic_menu_star无法正常工作?

Android drawable ic_menu_star无法正常工作?

我正在设计XML菜单:

    <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:icon="@android:drawable/ic_menu_preferences" android:title="@string/menu_preferences" android:id="@+id/menu_preferences"/>
    <item android:id="@+id/menu_bookmarks" android:title="@string/menu_bookmarks" android:icon="@android:drawable/ic_menu_star"></item>
    <item android:title="@string/menu_history" android:id="@+id/menu_history" android:icon="@android:drawable/ic_menu_recent_history"></item>
</menu>

当我尝试使用android画眉笔ic_menu_star时,我的日食抛出错误:

[2011-07-06 00:52:28 - Testapp] W/ResourceType( 1852): Bad XML block: header size 51 or total size 3342532 is larger than data size 0
[2011-07-06 00:52:28 - Testapp] C:\eclipseprojects\Testapp\res\menu\search_menu.xml:4: error: Error: Resource is not public. (at 'icon' with value '@android:drawable/ic_menu_star').

我已经检查了项目中的android资源,它就在其中。我在android 2.1框架上构建我的项目。这是一个错误吗?

Android listfragment onItemClick无法正常工作?

Android listfragment onItemClick无法正常工作?

我有一个ListFragment,我想使用onitemclick事件.但我有很多问题.你能帮助我吗 ?我把事件开始是正确的还是正确的?

提前致谢. ..

  public class MesajFragment extends android.support.v4.app.ListFragment
   ...
  @Override
public void onStart() {
    // Todo Auto-generated method stub
    super.onStart();

    getListView().setonItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // Todo Auto-generated method stub
            Toast.makeText(getActivity(), arg2 + " okwww ",
                    Toast.LENGTH_LONG);

        }
    });
}

解决方法:

你没有在吐司消息上调用.show().它应该如下所示:

Toast.makeText(getActivity(), arg2 + " okwww ",
                    Toast.LENGTH_LONG).show();

最后看到.show()?你的onClick可能正常工作.它似乎不是因为你的Toast消息没有显示

Android ScaleListener无法正常工作

Android ScaleListener无法正常工作

如何解决Android ScaleListener无法正常工作?

我有以下问题:我想检测和区分同一视图上的用户“触摸”和“单击”。我已经在其他视图上方的视图上注册了onTouch-Listener(参见代码)。

预期的行为::如果用户点击它,则onClick事件将被传递到其下方的视图。如果用户执行缩放手势,则下面的视图将被缩放。

使用侦听器查看

trackpad.setonTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view,MotionEvent motionEvent) {
            if(scaleDetector.onTouchEvent(motionEvent)) {
                Log.d("PadLayout","Scaling");
                return true;
            } else {
                Log.d("PadLayout","No Scale detected,this is a tap. Returning false.");
                return false;
            }
        }
    });

这是我的ScaleGestureDetector(“ scaleDetector”)中的ScaleListener:

private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
    float factor = 1;

    @Override
    public boolean onScale(ScaleGestureDetector scaleGestureDetector) {
        factor *= scaleGestureDetector.getScaleFactor();
        factor = Math.max(1,Math.min(factor,ResourcesCompat.getFloat(getResources(),R.dimen.pad_large)));
        setPadScaleFactor(factor); // this method sets scaleX and scaleY

        return true;
    }

    @Override
    public boolean onScaleBegin(ScaleGestureDetector scaleGestureDetector) {
        return true;
    }
}

此代码的问题在于,它永远不会检测到敲击。我可以缩放视图,但是一旦点击它,它什么也没做。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

android – ListView setOnItemClickListener无法正常工作

android – ListView setOnItemClickListener无法正常工作

就像标题所说,我的setonItemClickListener不起作用.我查看了迄今为止我所看到的所有内容,并且无法找到我的错误.

这是代码:

这是有问题的课程.它不是主类,而是从意图调用:

package...;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.listadapter;
import android.widget.ListView;

public class GroupActivity extends Activity {

    String group_id = "";
    Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_group);
        context = this;

        Intent intent = getIntent();
        group_id = intent.getStringExtra("group_id");
        Log.i("bla", "Launched GroupActivity for group_id " + group_id);

        final SubAdapter adapter = new SubAdapter(this, group_id);
        ListView lv = (ListView) findViewById(R.id.listView1);
        lv.setClickable(true);
        lv.setAdapter(adapter);

        lv.setonItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> av, View v, int idx, long lidx) {
                Log.i("print here", "blaa " + idx);

            }

        });


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

这是SubAdapter类:

package...;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.text.format.DateUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class SubAdapter extends BaseAdapter {

    private static final int thumb_width = 128;
    private static final int thumb_hight = 128;
    private static Bitmap default_thumb = null;
    private static LayoutInflater inflater = null;
    private final String group_id_;
    private final Activity activity;
    private final SubAdapter t = this;

    // used to keep selected position in ListView
    private int selectedPos = -1;   // init value for not-selected

    public SubAdapter(Activity a, final String group_id) {
        Drawable d = a.getResources().getDrawable(R.drawable.ic_contact_picture);
        default_thumb = ((BitmapDrawable) d).getBitmap();
        activity = a;
        group_id_ = group_id;
        inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(int idx, View convertView, ViewGroup parent) {
        Log.i("bla2", "getting view with index " + idx);
        View vi = convertView;

        if (convertView == null) {
            vi = inflater.inflate(R.layout.sub_list_item, null);
            vi.setClickable(true);
        }
        TextView tv1 = (TextView)vi.findViewById(R.id.textView1);
        TextView tv2 = (TextView)vi.findViewById(R.id.textView2);
        ImageView img = (ImageView)vi.findViewById(R.id.imageView1);

        tv1.setText("first name" + " " + "last name");
        tv2.setText("some date");

        // put thumbnail
        Bitmap thumb = default_thumb;
        img.setimageBitmap(thumb);
        Log.i("bla3", "index is " + idx + "selected index is " + selectedPos);
        if(selectedPos == idx){
            Log.i("bla4", "inside if");
         }      
        return vi;
    }


    public void setSelectedPosition(int pos){
    selectedPos = pos;
         // inform the view of this change
         notifyDataSetChanged();
    }

    @Override
    public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
    }

}

这是activity_group xml:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".GroupActivity" >

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:clickable="true"
        android:focusableInTouchMode="false"
        android:focusable="false" >

    </ListView>

</RelativeLayout>

这是sub_list_item xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="true"
    android:focusable="false" 
    android:focusableInTouchMode="false">

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_margin="6dp"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_margin="6dp"
        android:layout_toLeftOf="@+id/toggleButton1"
        android:layout_toRightOf="@+id/imageView1"
        android:text="some text"
        android:textAppearance="?android:attr/textAppearance" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:layout_toLeftOf="@+id/toggleButton1"
        android:text="more text"
        android:textAppearance="?android:attr/textAppearance" />

    <ToggleButton
        android:id="@+id/toggleButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_margin="6dp"
        android:text="present" />

</RelativeLayout>

除了点击监听器之外,其他一切似乎都有效. SubAdapter正确打开并填充列表.
基本上我正在寻找的是获取消息“Log.i(”print here“,”blaa“idx);”打印 – 它是ListView的setonItemClickListener中的日志(见上图)

如果缺少任何其他相关代码,请与我们联系
谢谢!!!

解决方法:

你可能应该删除这个电话
vi.setClickable(真);在您的SubAdapter类中,因为您的convertView将在onItemClick侦听器之前使用单击.

今天关于从JButton显示/隐藏JPopupMenu;FocusListener无法正常工作?button隐藏不可见的讲解已经结束,谢谢您的阅读,如果想了解更多关于Android drawable ic_menu_star无法正常工作?、Android listfragment onItemClick无法正常工作?、Android ScaleListener无法正常工作、android – ListView setOnItemClickListener无法正常工作的相关知识,请在本站搜索。

本文标签: