- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 UIViewController 调用 UICollectionView Controller 。我编译代码时没有收到错误,但是当我运行模拟器时会弹出以下错误。
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'UICollectionView must be initialized with a non-nil layout parameter'
*** First throw call stack:
(
0 CoreFoundation 0x00000001099806fb __exceptionPreprocess + 331
1 libobjc.A.dylib 0x0000000108ae9ac5 objc_exception_throw + 48
2 CoreFoundation 0x0000000109980555 +[NSException raise:format:] + 197
3 UIKitCore 0x000000010de713d8 -[UICollectionView initWithFrame:collectionViewLayout:] + 81
4 UIKitCore 0x000000010df3f090 -[UICollectionViewController _newCollectionViewWithFrame:collectionViewLayout:] + 94
5 UIKitCore 0x000000010df3e300 -[UICollectionViewController loadView] + 649
6 UIKitCore 0x000000010e000048 -[UIViewController loadViewIfRequired] + 172
7 UIKitCore 0x000000010df64004 -[UINavigationController _updateScrollViewFromViewController:toViewController:] + 68
8 UIKitCore 0x000000010df642f7 -[UINavigationController _startTransition:fromViewController:toViewController:] + 146
9 UIKitCore 0x000000010df653b5 -[UINavigationController _startDeferredTransitionIfNeeded:] + 896
10 UIKitCore 0x000000010df666a7 -[UINavigationController __viewWillLayoutSubviews] + 150
11 UIKitCore 0x000000010df4738d -[UILayoutContainerView layoutSubviews] + 217
12 UIKitCore 0x000000010ead09c1 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1417
13 QuartzCore 0x000000011002aeae -[CALayer layoutSublayers] + 173
14 QuartzCore 0x000000011002fb88 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 396
15 QuartzCore 0x000000011003bee4 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 72
16 QuartzCore 0x000000010ffab3aa _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 328
17 QuartzCore 0x000000010ffe2584 _ZN2CA11Transaction6commitEv + 608
18 UIKitCore 0x000000010e61bccb __34-[UIApplication _firstCommitBlock]_block_invoke_2 + 128
19 CoreFoundation 0x00000001098e7aec __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
20 CoreFoundation 0x00000001098e72b0 __CFRunLoopDoBlocks + 336
21 CoreFoundation 0x00000001098e1b34 __CFRunLoopRun + 1252
22 CoreFoundation 0x00000001098e1302 CFRunLoopRunSpecific + 626
23 GraphicsServices 0x0000000111ff72fe GSEventRunModal + 65
24 UIKitCore 0x000000010e602ba2 UIApplicationMain + 140
25 Byte 0x0000000105cd8c2b main + 75
26 libdyld.dylib 0x000000010ba7a541 start + 1
27 ??? 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
import UIKit
import Firebase
import ActiveLabel
private let reuseIdentifier = "Cell"
class FeedVC: UICollectionViewController, UICollectionViewDelegateFlowLayout, FeedCellDelegate {
// MARK: - Properties
var posts = [Post]()
var viewSinglePost = false
var post: Post?
var currentKey: String?
var userProfileController: UserProfileVC?
var delegate: FeedDelegate?
var messageNotificationView: MessageNotificationView = {
let view = MessageNotificationView()
return view
}()
// MARK: - Init
override func viewDidLoad() {
super.viewDidLoad()
collectionView?.backgroundColor = .white
// register cell classes
self.collectionView!.register(FeedCell.self, forCellWithReuseIdentifier: reuseIdentifier)
// configure refresh control
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(handleRefresh), for: .valueChanged)
collectionView?.refreshControl = refreshControl
// configure logout button
configureNavigationBar()
// fetch posts
if !viewSinglePost {
fetchPosts()
}
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
setUnreadMessageCount()
}
// MARK: - UICollectionViewFlowLayout
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let width = view.frame.width
var height = width + 8 + 40 + 8
height += 50
height += 60
return CGSize(width: width, height: height)
}
// MARK: - UICollectionViewDataSource
override func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
if posts.count > 4 {
if indexPath.item == posts.count - 1 {
fetchPosts()
}
}
}
override func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if viewSinglePost {
return 1
} else {
return posts.count
}
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! FeedCell
cell.delegate = self
if viewSinglePost {
if let post = self.post {
cell.post = post
}
} else {
cell.post = posts[indexPath.item]
}
handleHashtagTapped(forCell: cell)
handleUsernameLabelTapped(forCell: cell)
handleMentionTapped(forCell: cell)
return cell
}
// MARK: - FeedCellDelegate
func handleUsernameTapped(for cell: FeedCell) {
guard let post = cell.post else { return }
let userProfileVC = UserProfileVC(collectionViewLayout: UICollectionViewFlowLayout())
userProfileVC.user = post.user
navigationController?.pushViewController(userProfileVC, animated: true)
}
func handleOptionsTapped(for cell: FeedCell) {
guard let post = cell.post else { return }
if post.ownerUid == Auth.auth().currentUser?.uid {
let alertController = UIAlertController(title: "Options", message: nil, preferredStyle: .actionSheet)
alertController.addAction(UIAlertAction(title: "Delete Post", style: .destructive, handler: { (_) in
post.deletePost()
if !self.viewSinglePost {
self.handleRefresh()
} else {
if let userProfileController = self.userProfileController {
_ = self.navigationController?.popViewController(animated: true)
userProfileController.handleRefresh()
}
}
}))
alertController.addAction(UIAlertAction(title: "Edit Post", style: .default, handler: { (_) in
let uploadPostController = UploadPostVC()
let navigationController = UINavigationController(rootViewController: uploadPostController)
uploadPostController.postToEdit = post
uploadPostController.uploadAction = UploadPostVC.UploadAction(index: 1)
self.present(navigationController, animated: true, completion: nil)
}))
alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
present(alertController, animated: true, completion: nil)
}
}
func handleLikeTapped(for cell: FeedCell, isDoubleTap: Bool) {
guard let post = cell.post else { return }
if post.didLike {
// handle unlike post
if !isDoubleTap {
post.adjustLikes(addLike: false, completion: { (likes) in
cell.likesLabel.text = "\(likes) likes"
cell.likeButton.setImage(#imageLiteral(resourceName: "LikeOrangeIcon"), for: .normal)
})
}
} else {
// handle like post
post.adjustLikes(addLike: true, completion: { (likes) in
cell.likesLabel.text = "\(likes) likes"
cell.likeButton.setImage(#imageLiteral(resourceName: "LikeWhiteIcon"), for: .normal)
})
}
}
func handleShowLikes(for cell: FeedCell) {
guard let post = cell.post else { return }
guard let postId = post.postId else { return }
let followLikeVC = FollowLikeVC()
followLikeVC.viewingMode = FollowLikeVC.ViewingMode(index: 2)
followLikeVC.postId = postId
navigationController?.pushViewController(followLikeVC, animated: true)
}
func handleConfigureLikeButton(for cell: FeedCell) {
guard let post = cell.post else { return }
guard let postId = post.postId else { return }
guard let currentUid = Auth.auth().currentUser?.uid else { return }
USER_LIKES_REF.child(currentUid).observeSingleEvent(of: .value) { (snapshot) in
// check if post id exists in user-like structure
if snapshot.hasChild(postId) {
post.didLike = true
cell.likeButton.setImage(#imageLiteral(resourceName: "LikeOrangeIcon"), for: .normal)
} else {
post.didLike = false
cell.likeButton.setImage(#imageLiteral(resourceName: "LikeWhiteIcon-1"), for: .normal)
}
}
}
func configureCommentIndicatorView(for cell: FeedCell) {
guard let post = cell.post else { return }
guard let postId = post.postId else { return }
COMMENT_REF.child(postId).observeSingleEvent(of: .value) { (snapshot) in
if snapshot.exists() {
cell.addCommentIndicatorView(toStackView: cell.stackView)
} else {
cell.commentIndicatorView.isHidden = true
}
}
}
func handleCommentTapped(for cell: FeedCell) {
guard let post = cell.post else { return }
let commentVC = CommentVC(collectionViewLayout: UICollectionViewFlowLayout())
commentVC.post = post
navigationController?.pushViewController(commentVC, animated: true)
}
// MARK: - Handlers
@objc func handleMenuToggle() {
delegate?.handleMenuToggle(forMenuOption: nil)
}
@objc func handleRefresh() {
posts.removeAll(keepingCapacity: false)
self.currentKey = nil
fetchPosts()
collectionView?.reloadData()
}
@objc func handleShowMessages() {
let messagesController = MessagesController()
self.messageNotificationView.isHidden = true
navigationController?.pushViewController(messagesController, animated: true)
}
func handleHashtagTapped(forCell cell: FeedCell) {
cell.captionLabel.handleHashtagTap { (hashtag) in
let hashtagController = HashtagController(collectionViewLayout: UICollectionViewFlowLayout())
hashtagController.hashtag = hashtag.lowercased()
self.navigationController?.pushViewController(hashtagController, animated: true)
}
}
func handleMentionTapped(forCell cell: FeedCell) {
cell.captionLabel.handleMentionTap { (username) in
self.getMentionedUser(withUsername: username)
}
}
func handleUsernameLabelTapped(forCell cell: FeedCell) {
guard let user = cell.post?.user else { return }
guard let username = user.username else { return }
let customType = ActiveType.custom(pattern: "^\(username)\\b")
cell.captionLabel.handleCustomTap(for: customType) { (_) in
let userProfileController = UserProfileVC(collectionViewLayout: UICollectionViewFlowLayout())
userProfileController.user = user
self.navigationController?.pushViewController(userProfileController, animated: true)
}
}
func configureNavigationBar() {
// top bar to be updated with white logos
if !viewSinglePost {
// self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Logout", style: .plain, target: self, action: #selector(handleLogout))
// self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: #imageLiteral(resourceName: "send2"), style: .plain, target: self, action: #selector(handleShowMessages))
}
self.navigationItem.title = "Stream"
self.navigationController?.navigationBar.barTintColor = .darkGray
self.navigationController?.navigationBar.barStyle = .black
self.navigationItem.leftBarButtonItem = UIBarButtonItem(image: #imageLiteral(resourceName: "list").withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(handleMenuToggle))
}
func setUnreadMessageCount() {
if !viewSinglePost {
getUnreadMessageCount { (unreadMessageCount) in
guard unreadMessageCount != 0 else { return }
self.navigationController?.navigationBar.addSubview(self.messageNotificationView)
self.messageNotificationView.anchor(top: self.navigationController?.navigationBar.topAnchor, left: nil, bottom: nil, right: self.navigationController?.navigationBar.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 4, width: 20, height: 20)
self.messageNotificationView.layer.cornerRadius = 20 / 2
self.messageNotificationView.notificationLabel.text = "\(unreadMessageCount)"
}
}
}
@objc func handleLogout() {
let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
alertController.addAction(UIAlertAction(title: "Log Out", style: .destructive, handler: { (_) in
do {
try Auth.auth().signOut()
let loginVC = LoginVC()
let navController = UINavigationController(rootViewController: loginVC)
self.present(navController, animated: true, completion: nil)
} catch {
print("Failed to sign out")
}
}))
alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
present(alertController, animated: true, completion: nil)
}
// MARK: - API
func setUserFCMToken() {
guard let currentUid = Auth.auth().currentUser?.uid else { return }
guard let fcmToken = Messaging.messaging().fcmToken else { return }
let values = ["fcmToken": fcmToken]
USER_REF.child(currentUid).updateChildValues(values)
}
func fetchPosts() {
guard let currentUid = Auth.auth().currentUser?.uid else { return }
if currentKey == nil {
USER_FEED_REF.child(currentUid).queryLimited(toLast: 5).observeSingleEvent(of: .value, with: { (snapshot) in
self.collectionView?.refreshControl?.endRefreshing()
guard let first = snapshot.children.allObjects.first as? DataSnapshot else { return }
guard let allObjects = snapshot.children.allObjects as? [DataSnapshot] else { return }
allObjects.forEach({ (snapshot) in
let postId = snapshot.key
self.fetchPost(withPostId: postId)
})
self.currentKey = first.key
})
} else {
USER_FEED_REF.child(currentUid).queryOrderedByKey().queryEnding(atValue: self.currentKey).queryLimited(toLast: 6).observeSingleEvent(of: .value, with: { (snapshot) in
guard let first = snapshot.children.allObjects.first as? DataSnapshot else { return }
guard let allObjects = snapshot.children.allObjects as? [DataSnapshot] else { return }
allObjects.forEach({ (snapshot) in
let postId = snapshot.key
if postId != self.currentKey {
self.fetchPost(withPostId: postId)
}
})
self.currentKey = first.key
})
}
}
func fetchPost(withPostId postId: String) {
Database.fetchPost(with: postId) { (post) in
self.posts.append(post)
self.posts.sort(by: { (post1, post2) -> Bool in
return post1.creationDate > post2.creationDate
})
self.collectionView?.reloadData()
}
}
func getUnreadMessageCount(withCompletion completion: @escaping(Int) -> ()) {
guard let currentUid = Auth.auth().currentUser?.uid else { return }
var unreadCount = 0
USER_MESSAGES_REF.child(currentUid).observe(.childAdded) { (snapshot) in
let uid = snapshot.key
USER_MESSAGES_REF.child(currentUid).child(uid).observe(.childAdded, with: { (snapshot) in
let messageId = snapshot.key
MESSAGES_REF.child(messageId).observeSingleEvent(of: .value) { (snapshot) in
guard let dictionary = snapshot.value as? Dictionary<String, AnyObject> else { return }
let message = Message(dictionary: dictionary)
if message.fromId != currentUid {
if !message.read {
unreadCount += 1
}
}
completion(unreadCount)
}
})
}
}
}
import UIKit
import Firebase
class ContainerController: UIViewController {
// MARK: - Properties
let dot = UIView()
var isInitialLoad: Bool?
var menuController: MenuController!
var centerController: UIViewController!
var isExpanded = false
// MARK: - Init
override func viewDidLoad() {
super.viewDidLoad()
configureHomeController()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
return .slide
}
override var prefersStatusBarHidden: Bool {
return isExpanded
}
// MARK: - Handlers
func configureHomeController() {
let homeController = FeedVC()
homeController.delegate = self
centerController = UINavigationController(rootViewController: FeedVC())
view.addSubview(centerController.view)
addChild(centerController)
centerController.didMove(toParent: self)
}
func configureMenuController() {
if menuController == nil {
menuController = MenuController()
menuController.delegate = self
view.insertSubview(menuController.view, at: 0)
addChild(menuController)
menuController.didMove(toParent: self)
}
}
func animatePanel(shouldExpand: Bool, menuOption: MenuOption?) {
if shouldExpand {
// show menu
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: .curveEaseInOut, animations: {
self.centerController.view.frame.origin.x = self.centerController.view.frame.width - 80
}, completion: nil)
} else {
// hide menu
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: .curveEaseInOut, animations: {
self.centerController.view.frame.origin.x = 0
}) { (_) in
guard let menuOption = menuOption else { return }
self.didSelectMenuOption(menuOption: menuOption)
}
}
animateStatusBar()
}
func didSelectMenuOption(menuOption: MenuOption) {
switch menuOption {
case .Profile:
print("Show profile")
let controller = UserProfileVC()
present(UINavigationController(rootViewController: controller), animated: true, completion: nil)
case .Inbox:
print("Show Inbox")
let controller = MessagesController()
present(UINavigationController(rootViewController: controller), animated: true, completion: nil)
case .Notifications:
print("Show Notifications")
let controller = NotificationsVC()
present(UINavigationController(rootViewController: controller), animated: true, completion: nil)
case .Settings:
print("Show settings")
let controller = UserProfileVC()
present(UINavigationController(rootViewController: controller), animated: true, completion: nil)
}
}
func animateStatusBar() {
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: .curveEaseInOut, animations: {
self.setNeedsStatusBarAppearanceUpdate()
}, completion: nil)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if isInitialLoad != nil {
self.followeUserAfterSignUp(uid: "Rdqzc9WWv3OoQkzYrWgFVTuwwUu2")
}
}
// MARK: - API
func followeUserAfterSignUp(uid: String) {
if let isInitialLoad = isInitialLoad, isInitialLoad == true {
Database.fetchUser(with: uid) { (user) in
user.follow()
// self.selectedIndex = 1
}
}
}
func checkIfUserIsLoggedIn() {
if Auth.auth().currentUser == nil {
DispatchQueue.main.async {
let loginVC = LoginVC()
let navController = UINavigationController(rootViewController: loginVC)
self.present(navController, animated: true, completion: nil)
}
return
}
}
func observeNotifications() {
guard let currentUid = Auth.auth().currentUser?.uid else { return }
NOTIFICATIONS_REF.child(currentUid).observeSingleEvent(of: .value) { (snapshot) in
guard let allObjects = snapshot.children.allObjects as? [DataSnapshot] else { return }
allObjects.forEach({ (snapshot) in
let notificationId = snapshot.key
NOTIFICATIONS_REF.child(currentUid).child(notificationId).child("checked").observeSingleEvent(of: .value, with: { (snapshot) in
guard let checked = snapshot.value as? Int else { return }
if checked == 0 {
self.dot.isHidden = false
} else {
self.dot.isHidden = true
}
})
})
}
}
}
extension ContainerController: FeedDelegate {
func handleMenuToggle(forMenuOption menuOption: MenuOption?) {
if !isExpanded {
configureMenuController()
}
isExpanded = !isExpanded
animatePanel(shouldExpand: isExpanded, menuOption: menuOption)
}
}
最佳答案
在 FeedVC() 的 init 中,您必须将 CollectionViewFlowLayout 添加到 init
func configureHomeController() {
let layout = UICollectionViewFlowLayout()
let homeController = FeedVC(frame: .zero, collectionViewLayout: layout)
homeController.delegate = self
centerController = UINavigationController(rootViewController: FeedVC())
view.addSubview(centerController.view)
addChild(centerController)
centerController.didMove(toParent: self)
}
关于ios - UICollectionView 必须在 Swift 中使用非 nil 布局参数进行初始化,即使该参数是在 UICollectionView 文件中定义的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56795575/
我为 S3 做了一个额外的布局(所有布局的反叛),人们说,使用 layout-sw320dp 对 s3 有好处。一切正常,s3 选择了这个文件夹,布局在 s3 上看起来很棒。 但是当我尝试在 10"平
我是 CSS 的新手,我正在尝试创建一个 3 列布局。也应该有一个居中的页脚。页面的总高度应该填满当前的屏幕。宽度似乎不对。 目前,页脚在尺寸和位置上似乎都没有对齐。 I have attached
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
有没有办法确定设备是从右到左的语言(比如阿拉伯语)而不是从左到右的语言(英语)? 需要与旧 API 级别(低至 10)兼容的东西 解决方案 我最终在接受的答案中使用了 xml 方法。更进一步,我还添加
我是 QT 的新手。我试图通过实现下面看到的这个小窗口来理解布局机制。它在作为主窗口的 QWidget 下具有以下元素: 一个延伸到所有客户区域的大型 QWidget。 窗口顶部的两个 QWidget
Accordion 布局是堆叠面板布局,因为此时只有一个面板可见,但我想同时显示两个面板可见,所以我们可以使用 Accordion 面板来做到这一点吗?? 最佳答案 您不能扩展现有的 Accordio
我只是想知道,作为一个假设示例,针对以下场景布局表格的最佳方式是什么: 假设我正在编写一个用于跟踪学生出勤的应用程序。每年年初,我都想添加所有学生(我将手动执行此操作 - 现在,是否应该为这里的每个学
在 CVS 中,我们的项目中有多个目录。 有一个夜间构建,它必须从同一个 CVS 项目的不同目录中提取东西才能构建夜间构建。所以我应该记住这一点,如果我们迁移到 SVN,我必须修改构建脚本以从不同的存
我在 WPF Windows 上有几个列表框,带有 Height="Auto" Width="Auto"在表格上设置 表单大小在不同分辨率下完美匹配,但问题是当我按下最大化按钮时,在表单调整大小时会看
仅供引用,我是 WPF 的新手。 我正在我的 WPF 应用程序中创建一个侧边栏并想要圆角。我学到的不是可以附加到网格的属性。另外,我尝试将文本块放在边框控件中,但我收到的错误消息说“ child 只能
我是CodeIgniter的新手。我想使用包含菜单,页脚等的基本样式创建母版页或布局。我不想在所有页面中编写重复的内容并为所有页面自动加载。例如,我可以在asp.net中创建母版页,或者在asp.ne
我正在使用它来调试应用程序。调试的时候发现底部显示了一个窗口中变量的值,如图- 但是,当我显示表达式时,我得到这样的布局 - 我的问题是,是否可以更改变量窗口的布局也可以在右侧显示值,因为这对我来说很
上面的代码中,放置“as=”footer_links”是什么意思? 最佳答案 as="x" 语法定义模板可用来调用 block 的名称。因此,对于以下内容: 在outer_block.p
我试图编写一个检查注册表值的功能,以查看Windows上的控制台是否启用了颜色。 Computer\HKEY_CURRENT_USER\Console\VirtualTerminalLevel 如果您
我有一个布局,但无法提前定义其所有区域,因为它们是未知的。 稍后创建了 ItemView,我想使用 View 的 ID 作为区域名称在布局中创建一个新区域,这样我就可以说: layout.dynami
我们有一个相当复杂的 gulp 构建过程,涉及多个模块,每个模块都有一个或两个 watch 。我想在一个仪表板中监控这一点,如下所示: 每一列都是一个模块,列内的每一行都是后续的构建步骤。一旦第 1
这就是问题所在,我有一个 MainWindow 类,它在一个设置例程中扩展了 JFrame,我将该类的布局设置为新的 CardLayout()。这一切都工作正常,但是当我从 JFrame 请求布局并将
我正在制作一个简单的迷宫程序,用户可以在其中创建墙壁、路径、起点和终点,单击“解决”,迷宫将被解决。为此,我有一个大小为 640x480 的 java JFrame。在 JFrame 的左侧,我有一个
我正在使用它来调试应用程序。调试的时候发现底部显示了一个窗口中变量的值,如图- 但是,当我显示表达式时,我得到这样的布局 - 我的问题是,是否可以更改变量窗口的布局也可以在右侧显示值,因为这对我来说很
我已经编写了使用 VBox 作为布局的代码。我希望按钮出现在顶行,然后绘制 2 条水平线,在 400x400 场景中应位于 y=200 和 300 处。但输出显示了我给出的不同坐标处的线条。 我知道这
我是一名优秀的程序员,十分优秀!